diff --git a/.github/workflows/issues-notion-sync.yml b/.github/workflows/issues-notion-sync.yml new file mode 100644 index 000000000..551362b02 --- /dev/null +++ b/.github/workflows/issues-notion-sync.yml @@ -0,0 +1,29 @@ +name: Notion Sync + +on: + workflow_dispatch: + issues: + types: + [ + opened, + edited, + labeled, + unlabeled, + assigned, + unassigned, + milestoned, + demilestoned, + reopened, + closed, + ] + +jobs: + notion_job: + runs-on: ubuntu-latest + name: Add GitHub Issues to Notion + steps: + - name: Add GitHub Issues to Notion + uses: vulcanize/notion-github-action@v1.2.4-issueid + with: + notion-token: ${{ secrets.NOTION_TOKEN }} + notion-db: ${{ secrets.NOTION_DATABASE }} diff --git a/concurrent_iterator/README.md b/concurrent_iterator/README.md new file mode 100644 index 000000000..9de898e25 --- /dev/null +++ b/concurrent_iterator/README.md @@ -0,0 +1 @@ +# go-eth-state-node-iterator diff --git a/concurrent_iterator/fixture/chaindata.go b/concurrent_iterator/fixture/chaindata.go new file mode 100644 index 000000000..6961f58d8 --- /dev/null +++ b/concurrent_iterator/fixture/chaindata.go @@ -0,0 +1,27 @@ +package fixture + +import ( + "os" + "path/filepath" + "runtime" +) + +// TODO: embed some mainnet data +// import "embed" +//_go:embed mainnet_data.tar.gz + +var ( + ChainDataPath, AncientDataPath string +) + +func init() { + _, path, _, _ := runtime.Caller(0) + wd := filepath.Dir(path) + + ChainDataPath = filepath.Join(wd, "..", "fixture", "chaindata") + AncientDataPath = filepath.Join(ChainDataPath, "ancient") + + if _, err := os.Stat(ChainDataPath); err != nil { + panic("must populate chaindata at " + ChainDataPath) + } +} diff --git a/concurrent_iterator/fixture/chaindata/.gitignore b/concurrent_iterator/fixture/chaindata/.gitignore new file mode 100644 index 000000000..8836fe152 --- /dev/null +++ b/concurrent_iterator/fixture/chaindata/.gitignore @@ -0,0 +1,6 @@ +*.log +CURRENT* +LOCK +LOG +MANIFEST-* +ancient/FLOCK diff --git a/concurrent_iterator/fixture/chaindata/000002.ldb b/concurrent_iterator/fixture/chaindata/000002.ldb new file mode 100644 index 000000000..8e5331a4a Binary files /dev/null and b/concurrent_iterator/fixture/chaindata/000002.ldb differ diff --git a/concurrent_iterator/fixture/chaindata/ancient/bodies.0000.cdat b/concurrent_iterator/fixture/chaindata/ancient/bodies.0000.cdat new file mode 100644 index 000000000..838476f58 Binary files /dev/null and b/concurrent_iterator/fixture/chaindata/ancient/bodies.0000.cdat differ diff --git a/concurrent_iterator/fixture/chaindata/ancient/bodies.cidx b/concurrent_iterator/fixture/chaindata/ancient/bodies.cidx new file mode 100644 index 000000000..36aa86be2 Binary files /dev/null and b/concurrent_iterator/fixture/chaindata/ancient/bodies.cidx differ diff --git a/concurrent_iterator/fixture/chaindata/ancient/diffs.0000.rdat b/concurrent_iterator/fixture/chaindata/ancient/diffs.0000.rdat new file mode 100644 index 000000000..465f59014 Binary files /dev/null and b/concurrent_iterator/fixture/chaindata/ancient/diffs.0000.rdat differ diff --git a/concurrent_iterator/fixture/chaindata/ancient/diffs.ridx b/concurrent_iterator/fixture/chaindata/ancient/diffs.ridx new file mode 100644 index 000000000..35199450f Binary files /dev/null and b/concurrent_iterator/fixture/chaindata/ancient/diffs.ridx differ diff --git a/concurrent_iterator/fixture/chaindata/ancient/hashes.0000.rdat b/concurrent_iterator/fixture/chaindata/ancient/hashes.0000.rdat new file mode 100644 index 000000000..f865e0fb0 Binary files /dev/null and b/concurrent_iterator/fixture/chaindata/ancient/hashes.0000.rdat differ diff --git a/concurrent_iterator/fixture/chaindata/ancient/hashes.ridx b/concurrent_iterator/fixture/chaindata/ancient/hashes.ridx new file mode 100644 index 000000000..91c848901 Binary files /dev/null and b/concurrent_iterator/fixture/chaindata/ancient/hashes.ridx differ diff --git a/concurrent_iterator/fixture/chaindata/ancient/headers.0000.cdat b/concurrent_iterator/fixture/chaindata/ancient/headers.0000.cdat new file mode 100644 index 000000000..3e1c6d226 Binary files /dev/null and b/concurrent_iterator/fixture/chaindata/ancient/headers.0000.cdat differ diff --git a/concurrent_iterator/fixture/chaindata/ancient/headers.cidx b/concurrent_iterator/fixture/chaindata/ancient/headers.cidx new file mode 100644 index 000000000..232852292 Binary files /dev/null and b/concurrent_iterator/fixture/chaindata/ancient/headers.cidx differ diff --git a/concurrent_iterator/fixture/chaindata/ancient/receipts.0000.cdat b/concurrent_iterator/fixture/chaindata/ancient/receipts.0000.cdat new file mode 100644 index 000000000..808a2546d Binary files /dev/null and b/concurrent_iterator/fixture/chaindata/ancient/receipts.0000.cdat differ diff --git a/concurrent_iterator/fixture/chaindata/ancient/receipts.cidx b/concurrent_iterator/fixture/chaindata/ancient/receipts.cidx new file mode 100644 index 000000000..4683e016e Binary files /dev/null and b/concurrent_iterator/fixture/chaindata/ancient/receipts.cidx differ diff --git a/concurrent_iterator/fixture/paths.go b/concurrent_iterator/fixture/paths.go new file mode 100644 index 000000000..9ec4f7af6 --- /dev/null +++ b/concurrent_iterator/fixture/paths.go @@ -0,0 +1,616 @@ +package fixture + +var Block1_Paths = [][]byte{ + []byte{}, + []byte{0}, + []byte{0, 0}, + []byte{0, 0, 5, 14, 5, 4, 15, 1, 8, 6, 7, 15, 13, 0, 3, 0, 15, 9, 0, 6, 7, 3, 11, 8, 11, 6, 2, 5, 10, 12, 8, 15, 0, 6, 5, 6, 14, 4, 4, 10, 8, 8, 12, 15, 12, 0, 11, 3, 10, 15, 3, 14, 3, 15, 3, 12, 3, 13, 4, 8, 6, 9, 6, 0, 16}, + []byte{0, 2}, + []byte{0, 2, 1}, + []byte{0, 2, 1, 15, 14, 3, 3, 6, 0, 11, 10, 8, 12, 0, 2, 14, 1, 9, 4, 15, 8, 14, 7, 15, 10, 12, 13, 14, 11, 9, 0, 8, 8, 11, 3, 12, 15, 4, 3, 3, 11, 6, 4, 9, 8, 11, 13, 6, 9, 0, 0, 13, 5, 0, 13, 15, 0, 2, 6, 6, 15, 15, 14, 3, 16}, + []byte{0, 2, 8}, + []byte{0, 2, 8, 14, 6, 2, 12, 11, 4, 6, 6, 5, 15, 12, 14, 1, 9, 10, 14, 1, 15, 12, 1, 3, 10, 6, 0, 4, 6, 1, 8, 13, 7, 13, 2, 0, 11, 14, 0, 3, 7, 15, 12, 6, 8, 11, 6, 3, 11, 14, 11, 3, 3, 8, 4, 13, 15, 10, 5, 10, 11, 7, 7, 6, 16}, + []byte{0, 2, 12}, + []byte{0, 2, 12, 11, 5, 1, 7, 6, 7, 3, 5, 4, 14, 1, 15, 14, 6, 11, 13, 4, 10, 4, 9, 11, 6, 4, 11, 3, 7, 2, 1, 15, 15, 13, 13, 11, 12, 9, 5, 15, 14, 13, 1, 11, 8, 14, 10, 13, 0, 0, 5, 12, 3, 9, 11, 11, 12, 0, 7, 11, 12, 4, 13, 8, 16}, + []byte{0, 3}, + []byte{0, 3, 0, 8, 9, 14, 0, 1, 11, 14, 9, 14, 11, 2, 10, 15, 5, 15, 15, 5, 15, 10, 1, 12, 5, 9, 8, 3, 12, 6, 12, 6, 15, 11, 7, 8, 13, 13, 7, 3, 4, 6, 5, 8, 13, 1, 15, 8, 15, 1, 1, 13, 4, 15, 8, 13, 2, 7, 10, 2, 3, 15, 13, 5, 16}, + []byte{0, 4}, + []byte{0, 4, 2, 4, 2, 9, 5, 4, 10, 5, 12, 11, 9, 7, 4, 8, 13, 3, 15, 6, 6, 11, 12, 13, 4, 5, 8, 3, 15, 13, 3, 8, 3, 0, 2, 8, 7, 10, 10, 5, 8, 5, 11, 14, 11, 13, 9, 13, 13, 0, 6, 15, 10, 6, 6, 2, 5, 9, 7, 6, 11, 14, 4, 9, 16}, + []byte{0, 6}, + []byte{0, 6, 3}, + []byte{0, 6, 3, 3, 9, 9, 3, 5, 1, 1, 1, 11, 4, 10, 5, 6, 3, 10, 2, 8, 10, 9, 1, 12, 2, 5, 3, 11, 6, 3, 8, 10, 15, 8, 6, 8, 11, 3, 10, 15, 7, 12, 3, 7, 2, 12, 10, 11, 4, 9, 7, 12, 10, 12, 4, 15, 6, 12, 11, 2, 12, 0, 10, 10, 16}, + []byte{0, 6, 13}, + []byte{0, 6, 13, 9, 14, 4, 11, 9, 10, 11, 12, 0, 11, 8, 9, 7, 8, 1, 2, 0, 13, 4, 5, 1, 14, 11, 4, 12, 12, 10, 4, 15, 7, 2, 15, 15, 1, 13, 9, 7, 3, 2, 1, 7, 1, 3, 14, 0, 14, 15, 3, 7, 9, 10, 1, 5, 7, 11, 8, 15, 2, 11, 6, 0, 16}, + []byte{0, 7}, + []byte{0, 7, 12, 5, 7, 7, 8, 0, 13, 11, 2, 13, 0, 11, 8, 1, 2, 5, 8, 10, 13, 3, 11, 14, 5, 13, 15, 2, 12, 3, 10, 9, 14, 8, 9, 14, 4, 12, 0, 6, 11, 15, 10, 13, 13, 12, 3, 10, 1, 15, 4, 14, 3, 11, 9, 4, 0, 1, 2, 1, 5, 9, 4, 7, 16}, + []byte{0, 8}, + []byte{0, 8, 7}, + []byte{0, 8, 7, 15, 11, 1, 0, 8, 14, 6, 8, 3, 6, 10, 0, 8, 8, 14, 0, 6, 1, 5, 6, 11, 1, 10, 2, 6, 2, 1, 0, 13, 1, 15, 5, 2, 8, 4, 2, 9, 6, 11, 3, 0, 11, 0, 11, 11, 0, 11, 3, 13, 1, 12, 2, 10, 7, 14, 0, 1, 10, 12, 1, 1, 16}, + []byte{0, 8, 11}, + []byte{0, 8, 11, 3, 15, 9, 10, 9, 6, 11, 10, 11, 10, 1, 2, 15, 4, 7, 4, 3, 0, 15, 2, 11, 0, 14, 2, 8, 5, 1, 15, 4, 0, 7, 14, 8, 12, 10, 3, 5, 5, 11, 11, 8, 10, 9, 10, 6, 9, 2, 4, 2, 11, 12, 9, 9, 10, 14, 12, 12, 2, 12, 15, 3, 16}, + []byte{0, 9}, + []byte{0, 9, 9}, + []byte{0, 9, 9, 9, 15, 1, 8, 13, 14, 7, 7, 14, 9, 4, 5, 1, 8, 6, 7, 12, 11, 1, 9, 3, 5, 15, 9, 10, 12, 13, 5, 6, 15, 7, 9, 12, 11, 12, 1, 1, 13, 0, 4, 8, 2, 6, 12, 3, 13, 10, 6, 11, 4, 2, 0, 10, 4, 15, 4, 11, 11, 14, 2, 1, 16}, + []byte{0, 9, 10}, + []byte{0, 9, 10, 15, 9, 14, 7, 14, 10, 2, 3, 7, 0, 10, 11, 3, 14, 3, 14, 14, 7, 15, 0, 10, 4, 6, 5, 10, 7, 13, 10, 12, 11, 6, 12, 9, 11, 7, 14, 6, 5, 1, 9, 6, 13, 12, 4, 9, 6, 13, 5, 5, 7, 0, 10, 0, 13, 8, 0, 2, 0, 11, 13, 10, 16}, + []byte{0, 12}, + []byte{0, 12, 3, 10, 3, 12, 9, 9, 15, 3, 4, 10, 15, 14, 9, 13, 2, 12, 8, 12, 14, 12, 12, 9, 0, 5, 2, 4, 14, 15, 6, 3, 10, 15, 12, 9, 15, 12, 1, 3, 3, 8, 4, 13, 5, 13, 9, 3, 1, 2, 8, 1, 15, 4, 1, 4, 13, 5, 13, 4, 8, 7, 12, 0, 16}, + []byte{0, 13}, + []byte{0, 13, 2, 1, 14, 11, 4, 15, 7, 12, 2, 0, 2, 14, 14, 12, 12, 13, 6, 13, 8, 7, 6, 2, 7, 15, 3, 13, 5, 1, 2, 14, 6, 3, 0, 13, 4, 13, 0, 5, 5, 7, 8, 5, 8, 5, 8, 4, 7, 1, 6, 8, 7, 5, 8, 15, 13, 1, 10, 10, 14, 13, 2, 2, 16}, + []byte{0, 14}, + []byte{0, 14, 8, 2, 7, 1, 10, 4, 4, 12, 6, 3, 4, 11, 7, 15, 14, 13, 12, 13, 0, 0, 12, 11, 0, 9, 10, 15, 14, 10, 2, 10, 7, 0, 10, 12, 8, 3, 8, 0, 11, 6, 11, 15, 5, 15, 6, 1, 15, 15, 0, 7, 14, 7, 9, 3, 14, 14, 3, 15, 6, 13, 4, 12, 16}, + []byte{1}, + []byte{1, 2}, + []byte{1, 2, 5}, + []byte{1, 2, 5, 10, 13, 12, 6, 7, 14, 15, 14, 8, 11, 15, 6, 8, 0, 8, 12, 0, 2, 11, 13, 3, 10, 14, 2, 0, 2, 6, 2, 9, 5, 3, 11, 5, 14, 4, 5, 13, 10, 11, 4, 14, 11, 9, 3, 8, 6, 4, 4, 1, 12, 15, 6, 14, 12, 7, 3, 8, 1, 8, 4, 4, 16}, + []byte{1, 2, 7}, + []byte{1, 2, 7, 14, 12, 7, 0, 14, 10, 0, 13, 8, 10, 7, 11, 6, 2, 4, 4, 10, 14, 7, 13, 9, 5, 1, 11, 2, 2, 0, 4, 15, 7, 5, 3, 3, 6, 12, 15, 2, 1, 15, 4, 9, 13, 15, 6, 3, 7, 0, 10, 11, 9, 2, 0, 5, 3, 4, 12, 9, 5, 7, 2, 8, 16}, + []byte{1, 3}, + []byte{1, 3, 1}, + []byte{1, 3, 1, 8, 10, 4, 12, 2, 11, 12, 7, 3, 1, 7, 1, 8, 8, 5, 7, 2, 3, 8, 14, 12, 2, 12, 4, 2, 14, 4, 10, 9, 5, 12, 0, 10, 14, 11, 7, 2, 9, 0, 10, 6, 0, 12, 8, 10, 11, 11, 1, 1, 0, 12, 2, 14, 6, 3, 8, 3, 4, 1, 12, 2, 16}, + []byte{1, 3, 11}, + []byte{1, 3, 11, 8, 15, 5, 7, 5, 0, 9, 6, 1, 11, 5, 5, 8, 8, 11, 12, 6, 9, 15, 11, 13, 0, 11, 7, 0, 1, 4, 6, 1, 8, 5, 4, 14, 1, 1, 0, 15, 13, 7, 8, 12, 1, 4, 7, 6, 7, 5, 1, 5, 11, 13, 13, 8, 8, 2, 7, 2, 5, 9, 7, 5, 16}, + []byte{1, 4}, + []byte{1, 4, 6, 8, 2, 8, 8, 0, 5, 6, 3, 1, 0, 12, 8, 2, 10, 10, 4, 12, 0, 1, 10, 7, 14, 1, 2, 10, 1, 0, 15, 8, 1, 1, 1, 10, 0, 5, 6, 0, 14, 7, 2, 11, 7, 0, 0, 5, 5, 5, 4, 7, 9, 0, 3, 1, 11, 8, 6, 12, 3, 5, 7, 13, 16}, + []byte{1, 5}, + []byte{1, 5, 11}, + []byte{1, 5, 11, 3, 8, 1, 11, 5, 1, 8, 12, 6, 11, 7, 5, 4, 1, 8, 5, 13, 6, 9, 0, 3, 12, 10, 15, 1, 7, 11, 4, 15, 8, 13, 12, 3, 0, 11, 10, 11, 15, 14, 13, 15, 8, 0, 7, 2, 11, 1, 1, 8, 11, 11, 12, 3, 14, 14, 12, 3, 0, 1, 3, 15, 16}, + []byte{1, 5, 12}, + []byte{1, 5, 12, 5, 3, 12, 5, 8, 2, 2, 8, 4, 14, 12, 9, 3, 0, 7, 5, 0, 8, 4, 11, 10, 14, 0, 5, 3, 6, 11, 5, 10, 11, 7, 10, 14, 4, 4, 10, 4, 4, 14, 14, 2, 7, 1, 8, 4, 8, 9, 11, 7, 2, 11, 14, 3, 10, 10, 7, 8, 12, 3, 12, 7, 16}, + []byte{1, 5, 15}, + []byte{1, 5, 15, 14, 15, 14, 8, 6, 1, 3, 10, 1, 14, 6, 7, 3, 5, 6, 7, 10, 10, 12, 8, 3, 2, 9, 4, 15, 10, 0, 13, 10, 6, 13, 0, 4, 8, 14, 5, 12, 7, 6, 4, 2, 2, 2, 7, 0, 1, 7, 4, 4, 1, 12, 9, 15, 8, 9, 9, 15, 14, 13, 1, 11, 16}, + []byte{1, 6}, + []byte{1, 6, 2, 3, 8, 6, 11, 14, 0, 10, 5, 2, 5, 12, 5, 10, 9, 14, 6, 1, 1, 0, 12, 7, 2, 4, 4, 10, 3, 7, 5, 0, 3, 8, 12, 5, 2, 5, 15, 14, 1, 0, 2, 13, 15, 2, 2, 4, 2, 8, 6, 1, 6, 1, 11, 1, 2, 8, 9, 11, 12, 7, 1, 6, 16}, + []byte{1, 8}, + []byte{1, 8, 13, 12, 13, 4, 3, 5, 11, 15, 7, 13, 1, 8, 2, 0, 0, 8, 5, 15, 6, 12, 4, 6, 13, 5, 8, 7, 12, 10, 14, 6, 6, 9, 12, 10, 7, 12, 2, 13, 3, 10, 13, 4, 12, 14, 10, 9, 13, 11, 3, 2, 0, 10, 0, 11, 3, 12, 8, 11, 13, 2, 1, 13, 16}, + []byte{1, 10}, + []byte{1, 10, 6, 13, 9, 6, 7, 4, 10, 14, 12, 5, 12, 8, 3, 2, 9, 2, 5, 2, 12, 11, 6, 3, 4, 0, 2, 2, 3, 0, 8, 11, 15, 4, 12, 9, 8, 14, 7, 0, 14, 13, 14, 12, 6, 1, 3, 13, 9, 2, 5, 10, 11, 7, 8, 1, 4, 8, 3, 4, 4, 5, 10, 4, 16}, + []byte{1, 13}, + []byte{1, 13, 5, 0, 1, 3, 1, 11, 14, 8, 6, 8, 13, 14, 2, 7, 4, 1, 12, 11, 7, 7, 5, 13, 0, 15, 15, 8, 0, 0, 6, 3, 1, 15, 9, 6, 0, 6, 5, 15, 4, 0, 11, 6, 0, 8, 4, 5, 11, 12, 14, 7, 2, 14, 7, 8, 2, 7, 1, 8, 10, 15, 2, 3, 16}, + []byte{1, 14}, + []byte{1, 14, 2}, + []byte{1, 14, 2, 2, 7, 3, 3, 15, 1, 7, 3, 15, 11, 12, 9, 5, 15, 10, 0, 7, 9, 14, 13, 5, 0, 14, 12, 2, 4, 12, 4, 9, 8, 10, 8, 10, 10, 13, 2, 5, 1, 5, 13, 8, 2, 7, 14, 5, 15, 15, 8, 2, 0, 0, 12, 2, 4, 0, 14, 9, 12, 13, 12, 9, 16}, + []byte{1, 14, 11}, + []byte{1, 14, 11, 15, 13, 7, 13, 11, 11, 6, 8, 0, 4, 3, 5, 1, 8, 0, 4, 4, 4, 3, 13, 15, 0, 1, 10, 4, 8, 2, 14, 6, 4, 5, 1, 9, 1, 2, 11, 8, 8, 4, 12, 13, 2, 6, 11, 3, 1, 5, 0, 4, 11, 11, 7, 7, 11, 11, 14, 12, 9, 8, 6, 2, 16}, + []byte{1, 15}, + []byte{1, 15, 9}, + []byte{1, 15, 9, 9, 10, 15, 2, 13, 15, 2, 13, 10, 9, 12, 0, 1, 7, 6, 11, 13, 11, 3, 14, 9, 9, 5, 11, 13, 15, 10, 4, 7, 15, 15, 11, 15, 14, 6, 10, 3, 10, 10, 12, 15, 8, 14, 5, 4, 4, 0, 1, 15, 4, 13, 10, 12, 2, 14, 12, 14, 9, 3, 3, 8, 16}, + []byte{1, 15, 15}, + []byte{1, 15, 15, 15, 15, 1, 10, 4, 5, 5, 11, 6, 6, 13, 5, 2, 1, 0, 7, 10, 2, 6, 2, 3, 1, 15, 14, 14, 15, 11, 0, 15, 3, 5, 6, 5, 0, 6, 7, 14, 9, 5, 4, 4, 12, 15, 9, 4, 7, 0, 13, 9, 7, 5, 15, 0, 1, 1, 1, 1, 11, 1, 12, 15, 16}, + []byte{2}, + []byte{2, 0}, + []byte{2, 0, 9}, + []byte{2, 0, 9, 2, 11, 5, 6, 0, 2, 1, 2, 1, 12, 12, 4, 8, 4, 15, 10, 5, 5, 11, 9, 0, 12, 14, 10, 0, 11, 14, 1, 7, 13, 9, 3, 1, 1, 8, 4, 2, 6, 3, 9, 2, 5, 10, 8, 6, 4, 14, 0, 13, 5, 13, 4, 3, 10, 2, 0, 13, 6, 7, 11, 0, 16}, + []byte{2, 0, 14}, + []byte{2, 0, 14, 11, 15, 14, 15, 4, 3, 6, 3, 9, 2, 1, 5, 10, 14, 11, 3, 5, 14, 1, 14, 0, 0, 11, 12, 9, 6, 1, 7, 4, 15, 5, 2, 1, 5, 5, 10, 15, 11, 7, 8, 1, 6, 5, 9, 15, 3, 4, 6, 2, 8, 13, 1, 15, 3, 15, 7, 10, 14, 0, 1, 8, 16}, + []byte{2, 1}, + []byte{2, 1, 1}, + []byte{2, 1, 1, 2, 0, 14, 1, 11, 14, 0, 3, 13, 3, 8, 4, 14, 14, 3, 2, 10, 9, 11, 13, 7, 2, 6, 8, 5, 7, 8, 13, 8, 8, 2, 9, 15, 2, 7, 1, 5, 4, 0, 12, 8, 4, 8, 12, 9, 7, 10, 4, 9, 5, 9, 9, 0, 11, 12, 4, 8, 15, 5, 8, 2, 16}, + []byte{2, 1, 3}, + []byte{2, 1, 3, 9, 15, 10, 1, 10, 10, 10, 3, 13, 6, 0, 14, 5, 3, 13, 0, 7, 0, 13, 5, 10, 1, 15, 1, 10, 12, 9, 12, 8, 2, 1, 1, 15, 4, 1, 11, 2, 13, 13, 5, 10, 1, 8, 1, 3, 4, 1, 6, 12, 8, 4, 4, 7, 10, 7, 7, 5, 9, 5, 5, 7, 16}, + []byte{2, 1, 14}, + []byte{2, 1, 14, 10, 8, 11, 13, 15, 8, 10, 4, 14, 10, 6, 13, 12, 9, 14, 2, 0, 4, 5, 9, 1, 13, 8, 8, 12, 3, 11, 5, 11, 1, 9, 5, 3, 3, 13, 3, 3, 11, 15, 11, 12, 5, 9, 12, 0, 8, 12, 12, 10, 2, 6, 6, 12, 3, 12, 8, 7, 10, 9, 6, 0, 16}, + []byte{2, 5}, + []byte{2, 5, 8, 4, 8, 7, 15, 1, 13, 4, 8, 9, 4, 5, 12, 7, 7, 4, 3, 12, 4, 1, 2, 11, 0, 15, 0, 2, 6, 13, 7, 2, 2, 10, 4, 6, 4, 1, 13, 5, 9, 7, 8, 15, 1, 1, 10, 0, 11, 4, 4, 13, 11, 15, 7, 12, 1, 13, 2, 7, 4, 13, 4, 1, 16}, + []byte{2, 6}, + []byte{2, 6, 13, 11, 12, 12, 14, 1, 11, 5, 9, 9, 14, 11, 14, 13, 4, 6, 14, 2, 5, 6, 9, 5, 7, 9, 5, 6, 2, 0, 3, 1, 2, 5, 5, 14, 10, 9, 10, 1, 12, 1, 12, 5, 7, 5, 15, 13, 13, 13, 11, 0, 0, 0, 3, 15, 4, 13, 3, 8, 9, 1, 6, 5, 16}, + []byte{2, 9}, + []byte{2, 9, 1}, + []byte{2, 9, 1, 11, 6, 11, 11, 12, 10, 8, 7, 9, 13, 6, 8, 4, 3, 3, 7, 14, 14, 5, 14, 2, 11, 12, 10, 5, 13, 1, 8, 12, 15, 11, 2, 13, 3, 11, 7, 10, 9, 7, 12, 8, 1, 8, 7, 14, 7, 0, 3, 3, 0, 9, 5, 6, 4, 2, 8, 0, 2, 9, 5, 14, 16}, + []byte{2, 9, 7}, + []byte{2, 9, 7, 13, 3, 10, 12, 15, 15, 11, 9, 4, 2, 12, 7, 14, 6, 15, 3, 15, 11, 0, 2, 9, 11, 7, 3, 5, 3, 3, 8, 10, 12, 3, 4, 14, 3, 9, 12, 4, 12, 14, 9, 14, 8, 5, 2, 15, 6, 4, 13, 5, 0, 15, 11, 5, 7, 12, 12, 9, 7, 14, 12, 0, 16}, + []byte{2, 11}, + []byte{2, 11, 7}, + []byte{2, 11, 7, 10, 15, 11, 11, 1, 4, 11, 4, 12, 9, 0, 2, 15, 3, 7, 1, 6, 3, 11, 1, 5, 15, 7, 0, 15, 14, 8, 3, 3, 5, 13, 14, 12, 4, 14, 2, 6, 15, 11, 10, 14, 4, 7, 1, 8, 12, 0, 3, 15, 1, 9, 13, 10, 5, 10, 14, 12, 11, 14, 8, 11, 16}, + []byte{2, 11, 13}, + []byte{2, 11, 13, 9, 10, 14, 11, 13, 14, 4, 4, 7, 9, 4, 14, 6, 13, 11, 3, 1, 7, 11, 14, 6, 13, 8, 3, 12, 5, 10, 2, 6, 6, 14, 1, 10, 9, 6, 14, 1, 8, 14, 0, 4, 11, 12, 7, 0, 7, 3, 9, 9, 8, 11, 11, 7, 7, 9, 12, 15, 14, 2, 15, 14, 16}, + []byte{2, 13}, + []byte{2, 13, 1}, + []byte{2, 13, 1, 5, 14, 1, 14, 8, 2, 12, 10, 5, 0, 11, 7, 3, 3, 4, 11, 14, 8, 9, 9, 0, 11, 9, 3, 10, 8, 11, 0, 4, 3, 14, 7, 7, 1, 3, 4, 0, 12, 12, 9, 3, 9, 8, 11, 10, 10, 2, 3, 8, 4, 5, 7, 6, 3, 12, 6, 9, 6, 13, 2, 2, 16}, + []byte{2, 13, 15}, + []byte{2, 13, 15, 3, 7, 8, 14, 8, 14, 12, 14, 14, 7, 8, 5, 14, 1, 13, 6, 5, 2, 0, 0, 13, 7, 3, 8, 1, 7, 8, 4, 3, 2, 12, 11, 12, 9, 10, 13, 5, 5, 12, 4, 9, 14, 10, 5, 10, 15, 9, 0, 5, 6, 2, 9, 13, 3, 4, 8, 4, 1, 6, 12, 2, 16}, + []byte{2, 15}, + []byte{2, 15, 1, 11, 6, 10, 8, 15, 2, 2, 8, 6, 7, 5, 10, 1, 7, 1, 1, 2, 6, 13, 1, 7, 8, 1, 10, 14, 11, 5, 2, 7, 5, 6, 13, 6, 15, 14, 5, 6, 8, 5, 10, 15, 8, 12, 7, 14, 12, 2, 3, 13, 12, 8, 1, 8, 7, 13, 7, 8, 3, 13, 1, 15, 16}, + []byte{3}, + []byte{3, 0}, + []byte{3, 0, 0}, + []byte{3, 0, 0, 13, 2, 13, 11, 14, 8, 3, 10, 6, 11, 10, 7, 15, 13, 7, 5, 7, 3, 7, 12, 8, 13, 7, 4, 5, 3, 13, 9, 8, 4, 14, 7, 9, 3, 8, 11, 10, 7, 10, 14, 1, 1, 3, 13, 3, 13, 10, 2, 10, 13, 7, 4, 3, 3, 0, 6, 1, 1, 5, 7, 11, 16}, + []byte{3, 0, 1}, + []byte{3, 0, 1, 9, 12, 0, 10, 9, 1, 11, 10, 3, 0, 13, 3, 4, 6, 10, 5, 5, 8, 9, 0, 11, 1, 11, 0, 7, 2, 8, 7, 13, 8, 10, 10, 14, 3, 5, 11, 10, 10, 8, 12, 4, 0, 6, 8, 14, 15, 8, 15, 1, 13, 14, 6, 6, 0, 8, 4, 10, 12, 10, 7, 5, 16}, + []byte{3, 2}, + []byte{3, 2, 3}, + []byte{3, 2, 3, 14, 3, 9, 3, 7, 7, 4, 14, 14, 14, 12, 8, 14, 9, 13, 5, 9, 6, 2, 5, 8, 2, 6, 7, 13, 0, 1, 3, 3, 10, 5, 11, 2, 15, 0, 1, 12, 5, 6, 7, 8, 2, 2, 10, 4, 15, 15, 0, 1, 8, 4, 8, 8, 6, 7, 1, 14, 12, 11, 6, 14, 16}, + []byte{3, 2, 15}, + []byte{3, 2, 15, 12, 4, 15, 13, 3, 15, 12, 8, 3, 6, 12, 6, 13, 11, 0, 0, 5, 8, 15, 13, 2, 0, 15, 15, 7, 14, 8, 12, 10, 6, 1, 1, 8, 8, 5, 14, 11, 7, 2, 1, 5, 11, 3, 9, 15, 9, 7, 13, 2, 11, 4, 14, 7, 9, 7, 13, 12, 10, 2, 5, 4, 16}, + []byte{3, 3}, + []byte{3, 3, 1, 13, 9, 9, 12, 6, 11, 14, 12, 3, 10, 14, 12, 11, 14, 12, 9, 6, 2, 11, 14, 7, 4, 11, 2, 5, 4, 4, 8, 5, 1, 1, 9, 8, 3, 11, 0, 1, 3, 12, 0, 8, 7, 6, 15, 6, 15, 4, 14, 6, 0, 2, 9, 7, 7, 3, 13, 15, 10, 13, 6, 1, 16}, + []byte{3, 4}, + []byte{3, 4, 2}, + []byte{3, 4, 2, 7, 5, 12, 3, 1, 3, 12, 5, 2, 8, 6, 3, 1, 7, 7, 9, 4, 15, 0, 1, 5, 4, 15, 8, 14, 4, 15, 15, 10, 12, 15, 12, 8, 0, 13, 9, 13, 0, 12, 5, 11, 1, 8, 4, 13, 2, 4, 8, 2, 14, 7, 15, 9, 2, 1, 1, 15, 15, 12, 3, 14, 16}, + []byte{3, 4, 4}, + []byte{3, 4, 4, 4, 7, 10, 15, 11, 6, 8, 6, 11, 4, 0, 7, 4, 13, 3, 11, 9, 3, 11, 9, 9, 0, 7, 6, 10, 6, 0, 11, 5, 15, 5, 10, 9, 0, 2, 15, 10, 3, 2, 13, 15, 1, 8, 13, 8, 5, 15, 12, 1, 13, 1, 3, 10, 13, 10, 8, 12, 13, 11, 7, 1, 16}, + []byte{3, 4, 5}, + []byte{3, 4, 5, 6, 2, 14, 3, 10, 12, 14, 6, 0, 8, 11, 13, 13, 7, 5, 10, 1, 0, 14, 11, 1, 5, 3, 12, 11, 12, 2, 12, 0, 0, 14, 6, 9, 11, 9, 3, 5, 13, 4, 2, 15, 5, 7, 12, 1, 9, 3, 12, 3, 8, 14, 15, 6, 13, 6, 7, 4, 10, 11, 10, 12, 16}, + []byte{3, 6}, + []byte{3, 6, 11, 3, 0, 9, 6, 12, 9, 1, 2, 10, 13, 12, 7, 6, 7, 4, 12, 10, 9, 2, 11, 6, 8, 13, 13, 11, 3, 11, 0, 4, 9, 4, 14, 9, 11, 9, 8, 8, 15, 11, 14, 15, 1, 11, 14, 13, 7, 9, 3, 8, 14, 8, 15, 10, 12, 4, 12, 2, 13, 15, 7, 10, 16}, + []byte{3, 8}, + []byte{3, 8, 4, 0, 1, 11, 4, 14, 9, 7, 14, 6, 7, 12, 4, 10, 6, 13, 8, 0, 9, 5, 9, 7, 9, 11, 4, 12, 1, 14, 12, 11, 9, 14, 10, 15, 5, 7, 2, 6, 15, 12, 8, 10, 1, 2, 7, 9, 8, 9, 7, 5, 10, 7, 6, 5, 3, 14, 9, 8, 0, 8, 7, 2, 16}, + []byte{3, 9}, + []byte{3, 9, 12, 8, 11, 11, 9, 2, 2, 2, 7, 11, 10, 9, 1, 10, 2, 6, 5, 7, 15, 2, 9, 12, 5, 4, 9, 8, 15, 5, 12, 5, 11, 0, 7, 10, 14, 3, 6, 3, 6, 9, 12, 8, 13, 9, 2, 8, 3, 4, 4, 4, 15, 4, 7, 7, 9, 3, 0, 12, 7, 9, 11, 14, 16}, + []byte{3, 10}, + []byte{3, 10, 2}, + []byte{3, 10, 2, 12, 7, 13, 5, 1, 6, 4, 15, 6, 10, 1, 13, 8, 12, 11, 12, 5, 13, 9, 14, 2, 2, 8, 2, 5, 3, 14, 10, 14, 4, 10, 6, 6, 13, 8, 11, 0, 13, 5, 5, 0, 13, 0, 7, 12, 5, 3, 14, 12, 8, 4, 13, 4, 7, 14, 13, 1, 7, 1, 7, 2, 16}, + []byte{3, 10, 8}, + []byte{3, 10, 8, 2, 14, 1, 14, 5, 8, 10, 14, 6, 15, 1, 4, 15, 11, 11, 14, 11, 3, 5, 11, 6, 13, 8, 3, 3, 3, 3, 0, 12, 4, 15, 11, 5, 11, 3, 12, 11, 7, 7, 0, 3, 9, 1, 15, 5, 12, 12, 3, 4, 0, 9, 4, 9, 12, 6, 2, 5, 4, 14, 8, 3, 16}, + []byte{3, 10, 12}, + []byte{3, 10, 12, 3, 15, 14, 8, 4, 12, 6, 6, 3, 6, 0, 7, 14, 11, 11, 14, 0, 1, 12, 6, 11, 0, 0, 8, 13, 0, 2, 11, 9, 2, 14, 13, 4, 15, 14, 10, 11, 2, 6, 14, 13, 8, 1, 7, 1, 0, 1, 4, 8, 5, 3, 12, 0, 15, 9, 4, 1, 9, 12, 12, 8, 16}, + []byte{3, 11}, + []byte{3, 11, 10, 5, 10, 12, 7, 0, 10, 1, 8, 3, 9, 9, 8, 1, 7, 12, 12, 11, 14, 8, 11, 13, 4, 13, 9, 12, 7, 8, 1, 1, 5, 1, 3, 6, 12, 12, 6, 1, 6, 9, 9, 13, 5, 1, 10, 15, 8, 7, 6, 0, 8, 10, 15, 5, 2, 0, 2, 2, 6, 12, 3, 2, 16}, + []byte{3, 12}, + []byte{3, 12, 9, 11, 13, 2, 6, 8, 10, 14, 13, 12, 8, 13, 11, 11, 3, 6, 13, 11, 0, 10, 4, 6, 6, 4, 14, 1, 7, 11, 8, 3, 10, 11, 12, 15, 13, 8, 7, 14, 4, 0, 4, 9, 0, 1, 14, 14, 14, 7, 11, 13, 5, 7, 0, 4, 10, 9, 5, 0, 6, 4, 14, 14, 16}, + []byte{3, 13}, + []byte{3, 13, 10, 0, 6, 10, 6, 7, 14, 7, 15, 14, 14, 9, 12, 9, 3, 8, 1, 5, 5, 12, 5, 0, 14, 6, 12, 14, 12, 9, 13, 10, 7, 0, 11, 6, 6, 6, 7, 9, 14, 7, 7, 7, 13, 10, 6, 15, 0, 2, 1, 4, 9, 12, 6, 6, 7, 4, 12, 13, 9, 1, 0, 5, 16}, + []byte{3, 14}, + []byte{3, 14, 4}, + []byte{3, 14, 4, 0, 0, 15, 10, 3, 2, 6, 9, 8, 4, 9, 13, 14, 12, 0, 12, 11, 15, 4, 14, 13, 11, 13, 6, 6, 3, 6, 5, 7, 12, 7, 3, 11, 13, 12, 8, 12, 9, 7, 12, 0, 7, 10, 10, 1, 6, 6, 13, 13, 8, 11, 4, 9, 15, 0, 11, 1, 4, 0, 2, 8, 16}, + []byte{3, 14, 9}, + []byte{3, 14, 9, 10, 6, 3, 7, 12, 5, 8, 9, 8, 11, 7, 0, 5, 0, 6, 10, 3, 4, 7, 10, 14, 7, 11, 5, 7, 6, 8, 13, 1, 10, 8, 4, 0, 2, 2, 15, 9, 7, 0, 2, 14, 8, 2, 6, 8, 14, 8, 10, 5, 11, 10, 13, 14, 8, 1, 9, 4, 13, 13, 4, 7, 16}, + []byte{3, 14, 14}, + []byte{3, 14, 14, 10}, + []byte{3, 14, 14, 10, 7, 14, 8, 14, 2, 12, 10, 3, 14, 3, 8, 5, 15, 14, 3, 9, 13, 6, 0, 5, 0, 8, 6, 11, 0, 4, 9, 11, 9, 9, 13, 15, 1, 10, 13, 10, 11, 8, 5, 10, 1, 12, 6, 5, 6, 9, 8, 7, 3, 4, 2, 4, 15, 4, 8, 8, 12, 5, 10, 13, 16}, + []byte{3, 14, 14, 15}, + []byte{3, 14, 14, 15, 5, 10, 1, 14, 12, 6, 5, 14, 8, 10, 14, 1, 12, 8, 7, 11, 14, 5, 14, 13, 12, 4, 5, 0, 9, 9, 10, 12, 9, 14, 7, 7, 8, 3, 13, 4, 11, 8, 0, 7, 5, 8, 1, 0, 11, 10, 6, 8, 8, 14, 11, 4, 7, 9, 14, 7, 10, 7, 3, 0, 16}, + []byte{4}, + []byte{4, 0}, + []byte{4, 0, 6}, + []byte{4, 0, 6, 3, 7, 10, 5, 2, 9, 3, 2, 0, 13, 10, 12, 14, 5, 4, 7, 6, 3, 12, 2, 14, 6, 10, 12, 5, 2, 12, 5, 2, 2, 12, 8, 10, 4, 4, 6, 11, 10, 9, 11, 6, 15, 5, 4, 13, 10, 15, 8, 4, 12, 0, 14, 4, 4, 2, 1, 2, 4, 11, 9, 3, 16}, + []byte{4, 0, 15}, + []byte{4, 0, 15, 8, 5, 12, 11, 8, 1, 3, 6, 14, 9, 5, 2, 3, 8, 12, 14, 10, 4, 12, 11, 9, 5, 1, 10, 2, 14, 14, 6, 4, 5, 10, 4, 9, 9, 8, 12, 1, 0, 8, 8, 3, 1, 13, 5, 10, 11, 14, 1, 13, 8, 15, 4, 8, 6, 9, 6, 8, 6, 4, 12, 3, 16}, + []byte{4, 1}, + []byte{4, 1, 3, 5, 1, 11, 9, 5, 8, 11, 14, 1, 14, 9, 5, 12, 13, 12, 3, 7, 15, 7, 13, 2, 13, 6, 5, 4, 3, 1, 5, 14, 3, 3, 15, 15, 7, 15, 4, 5, 11, 10, 12, 9, 1, 7, 9, 15, 9, 2, 4, 2, 15, 13, 12, 8, 2, 8, 12, 8, 13, 2, 14, 3, 16}, + []byte{4, 2}, + []byte{4, 2, 1}, + []byte{4, 2, 1, 13, 15, 1, 15, 10, 2, 5, 9, 2, 2, 1, 13, 0, 2, 10, 10, 4, 9, 5, 6, 14, 11, 0, 13, 3, 5, 10, 12, 14, 3, 1, 8, 12, 10, 2, 4, 12, 0, 10, 3, 3, 10, 6, 4, 12, 1, 10, 15, 9, 6, 12, 15, 6, 7, 12, 15, 2, 4, 5, 11, 6, 16}, + []byte{4, 2, 11}, + []byte{4, 2, 11, 4, 5, 13, 14, 6, 8, 5, 3, 13, 4, 0, 6, 7, 8, 3, 11, 6, 11, 5, 0, 12, 3, 7, 8, 11, 15, 11, 6, 1, 13, 6, 12, 14, 5, 2, 7, 1, 11, 3, 11, 15, 8, 1, 3, 12, 12, 2, 11, 9, 5, 9, 0, 5, 5, 15, 12, 1, 2, 15, 9, 8, 16}, + []byte{4, 3}, + []byte{4, 3, 9, 2, 6, 2, 9, 6, 10, 10, 3, 12, 8, 14, 15, 10, 11, 7, 14, 2, 15, 15, 9, 11, 12, 6, 4, 4, 2, 3, 6, 1, 9, 3, 15, 10, 6, 5, 7, 7, 2, 6, 1, 2, 7, 5, 5, 9, 11, 10, 0, 6, 6, 8, 7, 3, 4, 13, 1, 11, 2, 7, 9, 0, 16}, + []byte{4, 5}, + []byte{4, 5, 11, 0, 9, 3, 7, 11, 15, 14, 3, 9, 11, 0, 15, 13, 10, 13, 12, 10, 10, 8, 9, 7, 4, 13, 10, 15, 3, 2, 4, 1, 9, 3, 6, 2, 4, 11, 4, 7, 15, 4, 9, 1, 8, 2, 3, 4, 6, 4, 5, 8, 1, 9, 8, 2, 3, 13, 11, 14, 12, 0, 7, 15, 16}, + []byte{4, 6}, + []byte{4, 6, 15, 3, 15, 8, 12, 12, 4, 8, 6, 14, 8, 0, 4, 7, 5, 6, 7, 2, 1, 2, 12, 0, 15, 0, 1, 1, 12, 0, 6, 5, 4, 6, 6, 11, 12, 11, 7, 6, 6, 4, 7, 13, 12, 15, 8, 7, 13, 4, 2, 7, 5, 6, 13, 7, 15, 11, 11, 15, 12, 11, 4, 11, 16}, + []byte{4, 7}, + []byte{4, 7, 1, 7, 0, 3, 12, 5, 14, 13, 10, 8, 6, 4, 4, 10, 6, 4, 12, 14, 12, 1, 5, 2, 12, 5, 8, 15, 5, 10, 10, 12, 14, 12, 9, 3, 13, 7, 2, 15, 11, 0, 11, 15, 10, 7, 0, 5, 15, 0, 4, 7, 3, 15, 9, 0, 4, 3, 10, 8, 3, 5, 7, 12, 16}, + []byte{4, 8}, + []byte{4, 8, 9, 15, 14, 6, 8, 6, 5, 4, 7, 15, 4, 10, 9, 9, 9, 13, 2, 8, 1, 8, 10, 14, 13, 11, 12, 1, 8, 11, 7, 3, 5, 14, 13, 2, 12, 13, 5, 0, 2, 12, 3, 0, 1, 2, 4, 10, 0, 11, 8, 10, 15, 8, 6, 1, 11, 2, 2, 5, 1, 15, 9, 1, 16}, + []byte{4, 11}, + []byte{4, 11, 6}, + []byte{4, 11, 6, 0, 2, 9, 7, 7, 3, 14, 7, 1, 7, 5, 15, 3, 2, 3, 9, 8, 4, 2, 2, 15, 13, 1, 8, 12, 6, 12, 11, 0, 9, 5, 14, 5, 2, 7, 8, 10, 12, 7, 11, 14, 4, 1, 12, 10, 4, 10, 5, 10, 6, 12, 0, 10, 6, 13, 13, 10, 1, 10, 7, 1, 16}, + []byte{4, 11, 9}, + []byte{4, 11, 9, 4, 5, 14, 15, 2, 14, 8, 12, 7, 8, 4, 8, 2, 11, 11, 15, 15, 12, 11, 13, 15, 4, 9, 2, 1, 12, 13, 3, 7, 5, 0, 6, 5, 14, 3, 11, 5, 0, 2, 4, 10, 3, 11, 14, 13, 4, 6, 9, 10, 9, 15, 3, 4, 11, 2, 14, 7, 7, 3, 14, 7, 16}, + []byte{4, 11, 12}, + []byte{4, 11, 12, 14, 4, 14, 0, 2, 9, 9, 14, 5, 3, 6, 2, 5, 7, 8, 10, 9, 5, 10, 2, 7, 11, 12, 11, 7, 7, 9, 11, 9, 10, 8, 9, 2, 3, 2, 2, 9, 6, 3, 8, 8, 13, 11, 8, 0, 3, 9, 0, 9, 6, 9, 6, 15, 9, 0, 6, 3, 5, 5, 8, 1, 16}, + []byte{4, 14}, + []byte{4, 14, 0, 9, 5, 5, 0, 13, 10, 9, 12, 10, 5, 5, 11, 10, 3, 7, 5, 14, 5, 6, 12, 5, 2, 5, 11, 4, 9, 11, 2, 7, 8, 1, 4, 13, 2, 0, 1, 6, 5, 5, 2, 8, 14, 4, 14, 7, 15, 3, 0, 9, 8, 7, 8, 2, 2, 1, 11, 2, 8, 7, 8, 11, 16}, + []byte{5}, + []byte{5, 0}, + []byte{5, 0, 3}, + []byte{5, 0, 3, 7, 11, 7, 1, 15, 0, 6, 3, 11, 15, 14, 6, 4, 7, 2, 3, 3, 15, 5, 7, 0, 10, 10, 0, 6, 6, 0, 2, 11, 1, 14, 6, 11, 5, 1, 2, 4, 13, 11, 0, 11, 1, 15, 14, 9, 9, 8, 9, 7, 5, 15, 9, 3, 11, 0, 15, 11, 1, 0, 8, 4, 16}, + []byte{5, 0, 9}, + []byte{5, 0, 9, 5, 11, 7, 6, 0, 2, 3, 9, 7, 4, 4, 4, 0, 14, 6, 12, 1, 5, 5, 14, 2, 6, 11, 3, 15, 7, 0, 8, 4, 15, 0, 11, 1, 9, 0, 1, 10, 0, 13, 15, 2, 1, 8, 3, 13, 12, 15, 14, 11, 14, 0, 1, 15, 3, 2, 6, 13, 5, 14, 9, 6, 16}, + []byte{5, 0, 15}, + []byte{5, 0, 15, 15, 4, 13, 4, 7, 10, 4, 6, 12, 9, 12, 13, 3, 5, 11, 0, 2, 9, 14, 9, 5, 14, 15, 9, 12, 9, 5, 7, 14, 5, 7, 13, 10, 9, 8, 7, 4, 9, 1, 15, 6, 14, 7, 11, 14, 2, 4, 2, 14, 7, 2, 11, 12, 5, 13, 3, 14, 8, 0, 8, 6, 16}, + []byte{5, 1}, + []byte{5, 1, 14}, + []byte{5, 1, 14, 14, 1, 14, 0, 8, 13, 11, 0, 1, 4, 15, 12, 6, 9, 9, 5, 8, 7, 6, 6, 7, 11, 7, 2, 5, 6, 14, 7, 11, 9, 0, 9, 0, 14, 1, 7, 5, 5, 12, 5, 8, 7, 4, 2, 0, 12, 15, 15, 5, 15, 11, 14, 0, 14, 2, 0, 1, 9, 4, 15, 12, 16}, + []byte{5, 1, 15}, + []byte{5, 1, 15, 0, 14, 2, 1, 13, 8, 12, 8, 10, 14, 14, 15, 6, 0, 13, 10, 6, 10, 14, 5, 8, 13, 1, 0, 13, 12, 15, 1, 15, 4, 2, 14, 7, 13, 9, 10, 0, 12, 11, 8, 14, 14, 2, 11, 4, 10, 9, 7, 12, 10, 10, 5, 6, 6, 10, 1, 5, 2, 11, 6, 1, 16}, + []byte{5, 2}, + []byte{5, 2, 8}, + []byte{5, 2, 8, 11, 5, 5, 5, 6, 4, 14, 8, 5, 1, 8, 5, 4, 8, 14, 4, 2, 11, 5, 3, 4, 13, 10, 3, 10, 5, 2, 6, 1, 7, 9, 11, 8, 2, 0, 15, 2, 6, 4, 14, 14, 7, 12, 6, 9, 2, 9, 13, 0, 0, 11, 0, 11, 6, 10, 3, 1, 12, 15, 12, 2, 16}, + []byte{5, 2, 10}, + []byte{5, 2, 10, 6, 15, 11, 5, 6, 14, 1, 3, 13, 4, 5, 15, 14, 1, 6, 4, 5, 6, 14, 8, 2, 8, 12, 8, 12, 3, 7, 5, 11, 0, 13, 14, 12, 10, 10, 14, 2, 13, 6, 4, 4, 11, 7, 6, 15, 8, 10, 9, 11, 0, 10, 7, 4, 1, 13, 14, 1, 14, 13, 8, 9, 16}, + []byte{5, 3}, + []byte{5, 3, 8, 0, 12, 7, 11, 7, 10, 14, 8, 1, 10, 5, 8, 14, 11, 9, 8, 13, 9, 12, 7, 8, 13, 14, 4, 10, 1, 15, 13, 7, 15, 13, 9, 5, 3, 5, 15, 12, 9, 5, 3, 14, 13, 2, 11, 14, 6, 0, 2, 13, 10, 10, 10, 4, 1, 7, 6, 7, 3, 1, 2, 10, 16}, + []byte{5, 4}, + []byte{5, 4, 6}, + []byte{5, 4, 6, 6, 9, 0, 12, 15, 9, 5, 1, 0, 11, 4, 11, 7, 7, 3, 2, 13, 2, 12, 9, 9, 12, 7, 12, 2, 13, 9, 9, 4, 15, 6, 6, 6, 8, 11, 7, 13, 7, 15, 7, 5, 10, 1, 13, 2, 8, 12, 0, 14, 11, 10, 5, 3, 15, 7, 8, 4, 15, 14, 1, 14, 16}, + []byte{5, 4, 12}, + []byte{5, 4, 12, 9, 0, 1, 15, 4, 1, 5, 14, 12, 15, 8, 9, 12, 4, 6, 1, 5, 9, 11, 3, 5, 6, 10, 4, 10, 9, 5, 14, 9, 14, 5, 6, 6, 6, 11, 12, 8, 8, 15, 8, 11, 15, 4, 11, 15, 5, 13, 9, 12, 1, 5, 10, 10, 12, 8, 7, 0, 9, 14, 0, 10, 16}, + []byte{5, 6}, + []byte{5, 6, 13, 4, 2, 3, 11, 10, 5, 9, 13, 15, 7, 0, 7, 5, 11, 2, 7, 14, 5, 13, 5, 7, 3, 10, 13, 8, 3, 9, 9, 10, 12, 6, 10, 11, 8, 10, 7, 5, 4, 1, 14, 15, 11, 9, 10, 1, 14, 6, 4, 6, 10, 6, 7, 2, 4, 4, 3, 0, 1, 15, 14, 13, 16}, + []byte{5, 8}, + []byte{5, 8, 3}, + []byte{5, 8, 3, 9, 2, 6, 2, 4, 4, 2, 11, 13, 8, 7, 11, 13, 12, 14, 9, 11, 12, 13, 8, 14, 9, 7, 6, 2, 8, 10, 8, 4, 15, 13, 0, 7, 10, 10, 15, 5, 5, 11, 10, 8, 12, 4, 12, 2, 9, 14, 1, 10, 14, 9, 1, 12, 11, 1, 7, 12, 11, 2, 2, 2, 16}, + []byte{5, 8, 11}, + []byte{5, 8, 11, 11, 8, 13, 7, 11, 10, 2, 15, 5, 2, 2, 2, 8, 8, 5, 3, 2, 3, 8, 11, 2, 6, 11, 15, 14, 3, 14, 11, 9, 6, 0, 7, 12, 14, 10, 9, 4, 4, 14, 7, 0, 2, 0, 4, 5, 8, 9, 8, 1, 6, 1, 8, 14, 15, 14, 8, 2, 8, 0, 10, 1, 16}, + []byte{5, 10}, + []byte{5, 10, 4, 11, 14, 2, 3, 2, 2, 14, 11, 5, 0, 12, 15, 14, 10, 1, 0, 5, 1, 9, 7, 8, 12, 2, 8, 4, 5, 2, 6, 12, 13, 5, 10, 6, 14, 2, 8, 12, 10, 12, 10, 6, 8, 1, 8, 5, 5, 7, 3, 6, 10, 5, 13, 3, 12, 3, 1, 13, 9, 11, 10, 13, 16}, + []byte{5, 11}, + []byte{5, 11, 7, 0, 14, 8, 0, 5, 3, 8, 10, 12, 13, 10, 11, 13, 6, 1, 3, 7, 3, 5, 3, 11, 0, 15, 9, 13, 8, 13, 1, 4, 9, 15, 4, 13, 11, 10, 9, 1, 14, 8, 11, 14, 2, 14, 7, 9, 4, 6, 14, 4, 0, 9, 11, 15, 13, 11, 14, 6, 8, 5, 11, 9, 16}, + []byte{5, 12}, + []byte{5, 12, 3, 3, 8, 2, 0, 12, 3, 13, 7, 6, 15, 4, 13, 14, 8, 13, 1, 14, 0, 14, 12, 10, 2, 4, 12, 7, 13, 2, 15, 11, 14, 15, 7, 6, 1, 8, 9, 11, 6, 10, 4, 3, 10, 7, 10, 15, 14, 10, 4, 13, 15, 13, 10, 5, 11, 5, 0, 14, 13, 11, 9, 6, 16}, + []byte{5, 13}, + []byte{5, 13, 9, 1, 1, 4, 14, 8, 12, 0, 11, 1, 14, 8, 5, 8, 11, 15, 7, 3, 2, 2, 14, 14, 12, 1, 2, 2, 14, 3, 15, 12, 4, 11, 0, 9, 8, 8, 15, 1, 4, 6, 6, 2, 0, 13, 14, 15, 0, 15, 13, 14, 9, 13, 11, 13, 3, 2, 2, 15, 3, 10, 0, 3, 16}, + []byte{5, 15}, + []byte{5, 15, 9, 14, 4, 14, 14, 1, 7, 2, 4, 6, 9, 12, 15, 13, 10, 3, 8, 10, 7, 4, 5, 7, 14, 15, 1, 9, 2, 11, 6, 14, 15, 11, 1, 6, 9, 15, 14, 13, 11, 7, 3, 9, 4, 3, 14, 4, 12, 9, 8, 7, 13, 4, 14, 11, 9, 1, 0, 1, 8, 9, 13, 4, 16}, + []byte{6}, + []byte{6, 0}, + []byte{6, 0, 4, 2, 5, 0, 1, 0, 5, 4, 8, 3, 1, 9, 2, 0, 11, 12, 9, 13, 5, 0, 10, 3, 3, 13, 6, 11, 14, 1, 11, 5, 10, 8, 2, 1, 4, 12, 3, 1, 11, 10, 9, 4, 1, 6, 9, 5, 8, 15, 8, 9, 9, 6, 12, 13, 11, 6, 13, 13, 11, 0, 5, 12, 16}, + []byte{6, 2}, + []byte{6, 2, 3}, + []byte{6, 2, 3, 15, 3, 0, 0, 11, 15, 6, 0, 0, 11, 7, 11, 0, 5, 0, 11, 9, 11, 7, 0, 15, 10, 5, 7, 1, 4, 0, 12, 5, 9, 10, 5, 15, 0, 11, 9, 15, 12, 5, 11, 9, 13, 0, 11, 13, 10, 11, 1, 1, 13, 1, 0, 8, 10, 7, 1, 15, 12, 1, 10, 3, 16}, + []byte{6, 2, 9}, + []byte{6, 2, 9, 8, 13, 14, 11, 7, 12, 7, 3, 6, 13, 12, 5, 0, 11, 4, 5, 9, 0, 12, 10, 0, 6, 6, 11, 7, 2, 1, 7, 3, 13, 4, 14, 2, 12, 3, 15, 7, 5, 11, 11, 1, 0, 9, 3, 9, 6, 15, 3, 2, 14, 10, 10, 15, 9, 10, 13, 1, 1, 11, 12, 8, 16}, + []byte{6, 4}, + []byte{6, 4, 0}, + []byte{6, 4, 0, 0}, + []byte{6, 4, 0, 0, 15, 12, 3, 2, 12, 5, 11, 2, 13, 3, 5, 8, 0, 12, 0, 14, 1, 9, 8, 8, 9, 4, 8, 7, 12, 15, 9, 14, 0, 5, 7, 13, 6, 11, 8, 2, 10, 9, 9, 11, 15, 3, 0, 14, 11, 6, 14, 5, 3, 9, 11, 7, 12, 13, 14, 5, 2, 6, 5, 5, 16}, + []byte{6, 4, 0, 5}, + []byte{6, 4, 0, 5, 2, 8, 14, 5, 12, 15, 1, 4, 3, 15, 1, 7, 3, 13, 2, 9, 12, 13, 8, 11, 4, 15, 8, 9, 6, 10, 1, 12, 6, 1, 2, 8, 15, 3, 4, 1, 6, 12, 8, 8, 7, 12, 1, 0, 13, 4, 10, 1, 1, 8, 9, 8, 8, 4, 1, 11, 4, 10, 8, 2, 16}, + []byte{6, 5}, + []byte{6, 5, 4}, + []byte{6, 5, 4, 5, 13, 9, 8, 11, 7, 12, 7, 13, 13, 9, 14, 0, 2, 3, 7, 5, 3, 10, 6, 4, 12, 5, 1, 5, 14, 6, 9, 14, 1, 9, 14, 7, 2, 11, 1, 8, 15, 1, 6, 3, 8, 3, 1, 12, 0, 8, 12, 7, 15, 5, 5, 9, 13, 13, 8, 1, 3, 4, 11, 5, 16}, + []byte{6, 5, 10}, + []byte{6, 5, 10, 1, 12, 5, 6, 6, 7, 7, 7, 6, 13, 13, 9, 10, 7, 2, 6, 10, 6, 7, 0, 3, 8, 14, 4, 5, 14, 0, 4, 0, 11, 1, 15, 10, 4, 6, 3, 14, 13, 5, 5, 15, 7, 5, 3, 12, 2, 1, 5, 6, 11, 3, 5, 5, 6, 1, 6, 15, 2, 12, 8, 2, 16}, + []byte{6, 5, 12}, + []byte{6, 5, 12, 10, 7, 3, 1, 5, 3, 12, 11, 8, 15, 0, 2, 2, 3, 3, 12, 0, 13, 1, 2, 15, 9, 9, 6, 14, 3, 13, 12, 1, 5, 8, 4, 15, 0, 4, 2, 6, 2, 8, 5, 15, 6, 3, 11, 15, 4, 1, 11, 14, 12, 9, 1, 10, 8, 6, 13, 3, 12, 3, 6, 14, 16}, + []byte{6, 5, 13}, + []byte{6, 5, 13, 0, 7, 11, 4, 13, 8, 1, 5, 0, 8, 12, 2, 4, 15, 5, 5, 1, 7, 2, 10, 15, 10, 11, 2, 9, 3, 5, 13, 11, 2, 1, 0, 6, 8, 9, 11, 10, 11, 10, 6, 2, 7, 0, 9, 9, 1, 15, 0, 2, 1, 8, 3, 5, 6, 7, 0, 5, 13, 12, 1, 12, 16}, + []byte{6, 6}, + []byte{6, 6, 0}, + []byte{6, 6, 0, 15, 4, 15, 9, 3, 8, 6, 5, 10, 13, 8, 0, 13, 0, 12, 9, 15, 1, 1, 5, 9, 11, 12, 1, 7, 14, 12, 10, 10, 3, 9, 8, 10, 0, 15, 4, 10, 15, 3, 10, 3, 7, 4, 13, 13, 0, 3, 3, 11, 2, 0, 0, 2, 9, 3, 7, 8, 9, 8, 0, 10, 16}, + []byte{6, 6, 8}, + []byte{6, 6, 8, 8, 12, 7, 11, 8, 12, 0, 2, 4, 2, 8, 10, 3, 11, 10, 7, 14, 0, 11, 8, 3, 2, 3, 7, 9, 7, 8, 10, 4, 6, 15, 10, 15, 9, 10, 6, 3, 2, 15, 12, 6, 1, 5, 13, 15, 12, 15, 7, 2, 2, 6, 4, 7, 3, 12, 2, 4, 4, 0, 0, 4, 16}, + []byte{6, 8}, + []byte{6, 8, 4}, + []byte{6, 8, 4, 2}, + []byte{6, 8, 4, 2, 7, 2, 5, 4, 7, 11, 10, 12, 4, 12, 0, 8, 3, 11, 7, 3, 8, 0, 15, 0, 5, 4, 13, 0, 8, 10, 5, 0, 3, 0, 8, 6, 2, 10, 5, 15, 0, 6, 10, 2, 3, 6, 7, 15, 3, 11, 8, 14, 8, 8, 0, 12, 4, 11, 7, 3, 7, 0, 14, 13, 16}, + []byte{6, 8, 4, 9}, + []byte{6, 8, 4, 9, 2, 15, 2, 0, 12, 1, 13, 7, 5, 9, 7, 4, 2, 5, 12, 8, 10, 5, 3, 10, 7, 15, 5, 14, 3, 8, 0, 15, 11, 12, 14, 0, 5, 8, 13, 1, 11, 15, 14, 10, 2, 5, 2, 1, 10, 7, 14, 8, 10, 15, 0, 3, 12, 3, 8, 7, 14, 1, 10, 0, 16}, + []byte{6, 8, 9}, + []byte{6, 8, 9, 8, 0, 2, 13, 6, 14, 13, 1, 10, 2, 8, 11, 0, 4, 9, 14, 9, 13, 4, 15, 14, 5, 3, 3, 4, 12, 5, 9, 0, 2, 15, 13, 9, 11, 12, 0, 0, 12, 4, 2, 8, 2, 1, 12, 8, 2, 15, 8, 2, 14, 14, 2, 13, 10, 1, 0, 11, 14, 9, 0, 8, 16}, + []byte{6, 10}, + []byte{6, 10, 1}, + []byte{6, 10, 1, 12, 4, 14, 8, 11, 7, 12, 7, 1, 0, 5, 3, 1, 12, 9, 14, 6, 6, 1, 6, 6, 13, 0, 6, 2, 9, 15, 15, 4, 4, 3, 13, 15, 1, 9, 12, 14, 15, 10, 0, 8, 1, 14, 11, 4, 15, 15, 15, 12, 12, 7, 13, 2, 6, 7, 12, 14, 7, 12, 9, 2, 16}, + []byte{6, 10, 14}, + []byte{6, 10, 14, 15, 12, 7, 2, 9, 14, 2, 8, 14, 1, 11, 11, 13, 2, 14, 6, 3, 13, 13, 0, 8, 0, 3, 3, 1, 4, 13, 14, 11, 8, 0, 8, 10, 11, 0, 4, 4, 9, 0, 9, 10, 15, 8, 8, 2, 11, 7, 9, 3, 5, 13, 13, 0, 5, 15, 5, 9, 3, 9, 10, 4, 16}, + []byte{6, 11}, + []byte{6, 11, 2}, + []byte{6, 11, 2, 12, 0, 3, 1, 0, 3, 11, 5, 5, 10, 4, 5, 12, 12, 1, 14, 4, 5, 5, 0, 8, 8, 9, 10, 9, 3, 9, 6, 14, 7, 14, 3, 3, 1, 11, 5, 12, 15, 1, 7, 2, 9, 14, 4, 8, 7, 1, 15, 15, 4, 13, 14, 14, 7, 0, 1, 1, 3, 9, 14, 9, 16}, + []byte{6, 11, 12}, + []byte{6, 11, 12, 15, 13, 5, 8, 7, 6, 9, 12, 6, 9, 6, 6, 14, 3, 1, 10, 10, 11, 14, 2, 8, 10, 13, 13, 12, 14, 6, 1, 5, 1, 15, 2, 13, 13, 2, 14, 10, 1, 13, 9, 12, 3, 0, 7, 14, 0, 9, 12, 6, 12, 9, 13, 11, 9, 5, 11, 6, 11, 1, 0, 3, 16}, + []byte{6, 11, 14}, + []byte{6, 11, 14, 4, 14, 11, 2, 15, 11, 3, 0, 8, 15, 13, 6, 4, 1, 3, 4, 6, 5, 3, 3, 10, 4, 10, 12, 11, 9, 12, 4, 12, 12, 10, 3, 14, 2, 13, 4, 7, 8, 14, 9, 0, 7, 5, 5, 2, 2, 6, 4, 6, 12, 9, 7, 2, 10, 2, 0, 6, 2, 9, 8, 5, 16}, + []byte{6, 13}, + []byte{6, 13, 2}, + []byte{6, 13, 2, 0, 3, 2, 11, 0, 0, 2, 13, 13, 10, 8, 12, 5, 2, 8, 0, 11, 15, 4, 8, 2, 1, 3, 13, 7, 11, 9, 8, 1, 4, 7, 6, 10, 9, 10, 8, 14, 5, 3, 10, 6, 9, 10, 3, 9, 12, 6, 2, 5, 14, 5, 12, 8, 1, 2, 9, 14, 9, 2, 8, 7, 16}, + []byte{6, 13, 12}, + []byte{6, 13, 12, 8, 0, 9, 0, 1, 2, 12, 12, 9, 1, 3, 3, 5, 10, 5, 14, 10, 4, 14, 1, 8, 6, 11, 13, 0, 4, 4, 7, 9, 10, 10, 12, 7, 13, 10, 14, 1, 11, 12, 11, 13, 0, 2, 3, 11, 15, 6, 6, 0, 2, 1, 3, 10, 6, 9, 15, 4, 15, 13, 11, 13, 16}, + []byte{7}, + []byte{7, 1}, + []byte{7, 1, 10, 3, 12, 7, 15, 8, 13, 0, 15, 14, 8, 10, 11, 12, 9, 15, 11, 10, 11, 1, 8, 6, 0, 10, 13, 5, 7, 6, 14, 13, 13, 15, 15, 2, 1, 4, 4, 7, 6, 3, 9, 3, 7, 1, 9, 5, 14, 10, 4, 15, 0, 1, 2, 15, 12, 6, 2, 5, 11, 0, 5, 3, 16}, + []byte{7, 5}, + []byte{7, 5, 4, 2, 2, 10, 3, 13, 3, 6, 12, 9, 3, 15, 12, 11, 12, 12, 10, 13, 2, 14, 5, 0, 2, 7, 7, 5, 2, 2, 6, 15, 3, 7, 5, 14, 2, 6, 4, 14, 3, 5, 15, 12, 5, 5, 10, 12, 2, 0, 13, 15, 1, 14, 9, 15, 0, 5, 0, 14, 8, 11, 8, 12, 16}, + []byte{7, 7}, + []byte{7, 7, 4, 4, 11, 14, 2, 4, 2, 7, 12, 10, 12, 15, 1, 7, 0, 6, 2, 12, 11, 0, 3, 0, 13, 3, 0, 14, 3, 4, 12, 3, 11, 5, 4, 3, 11, 2, 8, 10, 8, 3, 7, 0, 7, 13, 15, 0, 4, 14, 6, 4, 13, 3, 15, 7, 13, 13, 11, 4, 7, 1, 11, 8, 16}, + []byte{7, 8}, + []byte{7, 8, 2}, + []byte{7, 8, 2, 0, 11, 4, 1, 3, 9, 4, 13, 7, 15, 3, 0, 15, 2, 11, 0, 2, 15, 2, 4, 15, 8, 10, 3, 3, 10, 15, 14, 8, 11, 9, 8, 12, 13, 6, 8, 8, 2, 7, 14, 12, 6, 5, 1, 10, 14, 12, 3, 11, 10, 3, 3, 14, 4, 1, 2, 0, 6, 15, 14, 2, 16}, + []byte{7, 8, 5}, + []byte{7, 8, 5, 10, 3, 2, 11, 15, 0, 15, 4, 2, 11, 13, 6, 12, 9, 8, 6, 11, 9, 0, 0, 0, 7, 0, 11, 13, 7, 0, 15, 15, 4, 14, 13, 5, 14, 10, 10, 13, 4, 4, 8, 14, 5, 7, 12, 15, 5, 13, 9, 9, 7, 2, 2, 4, 12, 3, 15, 8, 7, 12, 2, 12, 16}, + []byte{7, 9}, + []byte{7, 9, 13, 14, 11, 2, 15, 0, 4, 2, 15, 1, 7, 1, 7, 12, 12, 8, 8, 2, 12, 5, 10, 3, 8, 11, 11, 11, 6, 12, 5, 2, 4, 9, 3, 2, 3, 5, 2, 15, 15, 2, 5, 11, 10, 14, 11, 8, 11, 8, 15, 13, 2, 2, 2, 5, 0, 9, 5, 14, 2, 9, 10, 14, 16}, + []byte{7, 13}, + []byte{7, 13, 1}, + []byte{7, 13, 1, 0}, + []byte{7, 13, 1, 0, 0, 9, 3, 3, 1, 1, 9, 5, 15, 6, 10, 3, 12, 2, 14, 14, 14, 6, 10, 12, 4, 11, 4, 6, 6, 4, 15, 6, 1, 12, 7, 7, 7, 5, 0, 0, 12, 1, 6, 3, 14, 14, 8, 4, 7, 6, 9, 9, 1, 3, 5, 7, 8, 10, 3, 3, 11, 13, 15, 2, 16}, + []byte{7, 13, 1, 13}, + []byte{7, 13, 1, 13, 5, 15, 3, 10, 1, 4, 12, 0, 10, 11, 1, 3, 3, 11, 6, 5, 6, 9, 8, 12, 2, 13, 6, 2, 12, 8, 1, 8, 12, 6, 5, 15, 1, 3, 3, 0, 6, 12, 12, 11, 15, 13, 6, 1, 10, 10, 4, 11, 7, 5, 9, 0, 11, 11, 7, 8, 6, 6, 0, 12, 16}, + []byte{7, 13, 7}, + []byte{7, 13, 7, 6, 6, 5, 0, 3, 11, 9, 1, 5, 8, 14, 14, 0, 6, 11, 0, 10, 5, 8, 7, 8, 5, 9, 15, 6, 14, 2, 4, 9, 7, 4, 12, 7, 8, 12, 3, 10, 6, 4, 11, 6, 14, 4, 13, 8, 10, 14, 15, 11, 12, 11, 8, 10, 13, 3, 11, 12, 2, 1, 2, 7, 16}, + []byte{7, 14}, + []byte{7, 14, 8}, + []byte{7, 14, 8, 3, 3, 11, 9, 11, 8, 6, 7, 12, 10, 10, 14, 3, 13, 5, 14, 2, 11, 6, 4, 12, 1, 3, 10, 7, 4, 4, 15, 0, 14, 5, 12, 12, 1, 11, 15, 15, 5, 0, 15, 13, 11, 3, 7, 1, 3, 14, 3, 12, 5, 0, 5, 1, 1, 4, 10, 0, 7, 13, 14, 1, 16}, + []byte{7, 14, 11}, + []byte{7, 14, 11, 6, 15, 13, 10, 13, 12, 6, 7, 0, 3, 10, 13, 6, 4, 10, 7, 12, 12, 13, 5, 15, 14, 13, 13, 12, 7, 8, 8, 13, 12, 9, 2, 14, 15, 10, 12, 7, 14, 0, 6, 6, 14, 0, 1, 13, 5, 14, 11, 7, 1, 7, 6, 14, 9, 1, 10, 6, 3, 3, 1, 13, 16}, + []byte{8}, + []byte{8, 0}, + []byte{8, 0, 3}, + []byte{8, 0, 3, 8, 2, 2, 8, 0, 14, 2, 15, 4, 10, 8, 14, 10, 9, 0, 0, 1, 12, 8, 14, 2, 2, 3, 3, 2, 10, 3, 13, 12, 3, 13, 3, 10, 6, 9, 2, 11, 5, 4, 9, 13, 3, 12, 9, 0, 15, 6, 5, 7, 9, 6, 2, 7, 0, 14, 1, 14, 11, 7, 7, 0, 16}, + []byte{8, 0, 11}, + []byte{8, 0, 11, 14, 8, 5, 8, 10, 11, 0, 9, 7, 8, 9, 13, 2, 6, 12, 15, 1, 1, 2, 8, 7, 7, 5, 7, 5, 6, 10, 8, 10, 11, 14, 1, 12, 8, 15, 15, 12, 4, 2, 1, 8, 13, 3, 14, 9, 9, 0, 11, 3, 13, 2, 5, 10, 8, 2, 5, 8, 3, 2, 5, 5, 16}, + []byte{8, 2}, + []byte{8, 2, 6, 12, 14, 1, 13, 6, 0, 10, 12, 9, 15, 0, 10, 11, 5, 9, 4, 4, 10, 12, 15, 1, 12, 0, 6, 7, 0, 0, 10, 5, 8, 5, 15, 8, 4, 0, 7, 13, 6, 7, 0, 4, 9, 5, 12, 7, 8, 1, 1, 11, 9, 7, 12, 15, 8, 2, 6, 3, 11, 4, 3, 4, 16}, + []byte{8, 4}, + []byte{8, 4, 8, 4, 4, 5, 2, 14, 4, 15, 0, 12, 1, 10, 9, 15, 1, 1, 5, 12, 5, 2, 11, 4, 10, 12, 7, 8, 10, 0, 13, 14, 2, 15, 1, 11, 0, 10, 11, 1, 10, 4, 10, 10, 14, 8, 3, 9, 0, 4, 2, 6, 10, 12, 7, 1, 14, 0, 3, 15, 8, 7, 7, 9, 16}, + []byte{8, 8}, + []byte{8, 8, 1, 10, 5, 0, 6, 0, 3, 9, 14, 2, 5, 10, 8, 1, 8, 15, 3, 5, 10, 10, 0, 14, 3, 14, 12, 5, 8, 12, 6, 4, 13, 15, 5, 12, 1, 0, 6, 2, 4, 5, 13, 12, 2, 5, 14, 15, 6, 15, 10, 4, 12, 15, 1, 14, 11, 1, 10, 10, 11, 5, 6, 10, 16}, + []byte{8, 9}, + []byte{8, 9, 3}, + []byte{8, 9, 3, 8, 11, 14, 2, 10, 13, 9, 9, 5, 0, 3, 9, 0, 13, 6, 13, 9, 2, 2, 1, 3, 12, 10, 1, 0, 2, 15, 12, 2, 1, 10, 4, 3, 0, 4, 12, 8, 8, 3, 5, 4, 13, 0, 14, 7, 4, 15, 4, 11, 3, 15, 15, 6, 9, 6, 12, 14, 5, 7, 9, 1, 16}, + []byte{8, 9, 13}, + []byte{8, 9, 13, 0, 4, 11, 12, 11, 10, 3, 9, 6, 13, 1, 2, 13, 14, 1, 14, 13, 3, 6, 15, 4, 1, 13, 15, 6, 0, 12, 14, 0, 10, 14, 0, 4, 4, 9, 11, 10, 14, 8, 3, 15, 1, 4, 12, 7, 4, 0, 4, 5, 1, 12, 15, 1, 9, 3, 6, 2, 10, 14, 8, 15, 16}, + []byte{8, 10}, + []byte{8, 10, 14, 5, 8, 6, 10, 10, 1, 14, 12, 2, 12, 2, 9, 10, 12, 14, 13, 4, 15, 14, 11, 5, 10, 13, 15, 9, 3, 3, 6, 5, 4, 1, 7, 6, 9, 11, 9, 3, 12, 13, 5, 11, 8, 12, 12, 1, 11, 6, 4, 11, 7, 13, 8, 3, 1, 12, 7, 11, 0, 14, 12, 2, 16}, + []byte{8, 12}, + []byte{8, 12, 3}, + []byte{8, 12, 3, 10, 11, 0, 9, 7, 0, 11, 7, 3, 8, 9, 5, 11, 8, 12, 9, 9, 5, 9, 11, 10, 14, 6, 8, 5, 12, 3, 10, 1, 9, 15, 4, 5, 14, 11, 5, 10, 13, 8, 9, 13, 4, 2, 11, 5, 2, 10, 3, 4, 0, 14, 12, 4, 10, 12, 2, 0, 4, 13, 1, 9, 16}, + []byte{8, 12, 15}, + []byte{8, 12, 15, 14, 15, 10, 9, 8, 0, 6, 12, 9, 9, 13, 11, 8, 11, 14, 10, 1, 14, 13, 8, 14, 5, 3, 4, 15, 6, 13, 12, 13, 11, 8, 3, 5, 12, 13, 1, 4, 1, 0, 15, 1, 15, 2, 8, 7, 14, 10, 4, 2, 9, 3, 14, 2, 9, 10, 3, 14, 10, 12, 12, 0, 16}, + []byte{8, 13}, + []byte{8, 13, 13, 8, 1, 10, 6, 0, 3, 5, 5, 1, 3, 8, 14, 9, 10, 8, 0, 0, 5, 4, 6, 0, 3, 15, 14, 2, 3, 13, 7, 8, 9, 6, 5, 4, 4, 2, 5, 4, 15, 6, 6, 14, 2, 3, 6, 13, 4, 7, 8, 10, 9, 11, 0, 3, 3, 12, 3, 10, 0, 3, 3, 0, 16}, + []byte{8, 15}, + []byte{8, 15, 8}, + []byte{8, 15, 8, 7, 5, 5, 14, 5, 13, 8, 4, 1, 8, 7, 0, 4, 7, 7, 4, 15, 3, 8, 10, 12, 7, 9, 13, 13, 9, 4, 4, 12, 2, 2, 3, 11, 10, 14, 9, 10, 14, 3, 6, 1, 12, 5, 14, 15, 13, 13, 6, 1, 4, 13, 0, 9, 12, 6, 0, 15, 13, 12, 15, 12, 16}, + []byte{8, 15, 13}, + []byte{8, 15, 13, 5, 6, 15, 15, 4, 7, 4, 6, 0, 2, 12, 9, 8, 1, 3, 6, 15, 4, 10, 9, 3, 8, 9, 14, 3, 14, 2, 11, 5, 13, 7, 14, 7, 8, 14, 12, 5, 5, 13, 5, 14, 13, 11, 6, 3, 15, 11, 4, 7, 7, 13, 7, 2, 8, 1, 4, 2, 4, 5, 1, 5, 16}, + []byte{9}, + []byte{9, 0}, + []byte{9, 0, 11, 0, 13, 2, 8, 9, 14, 10, 2, 1, 1, 13, 12, 10, 8, 14, 0, 2, 0, 12, 9, 12, 12, 8, 12, 5, 13, 6, 11, 10, 2, 15, 4, 1, 6, 15, 14, 1, 5, 15, 10, 6, 9, 2, 11, 4, 7, 1, 8, 4, 10, 4, 11, 9, 4, 6, 11, 2, 2, 1, 4, 13, 16}, + []byte{9, 5}, + []byte{9, 5, 4, 6, 13, 14, 10, 2, 2, 15, 2, 4, 7, 9, 7, 5, 2, 8, 1, 6, 11, 6, 5, 10, 10, 9, 13, 11, 1, 11, 8, 3, 5, 14, 15, 14, 15, 11, 12, 1, 14, 13, 1, 1, 8, 0, 4, 6, 9, 9, 6, 8, 3, 8, 9, 7, 12, 13, 10, 4, 2, 2, 7, 14, 16}, + []byte{9, 6}, + []byte{9, 6, 10}, + []byte{9, 6, 10, 13, 0, 11, 2, 7, 14, 15, 1, 0, 15, 10, 7, 10, 9, 9, 4, 0, 2, 9, 9, 13, 15, 1, 2, 2, 13, 3, 1, 2, 2, 2, 12, 12, 9, 1, 1, 11, 13, 2, 12, 9, 1, 13, 2, 7, 4, 0, 15, 2, 5, 10, 0, 13, 12, 9, 3, 1, 15, 4, 12, 0, 16}, + []byte{9, 6, 14}, + []byte{9, 6, 14, 1, 6, 10, 15, 9, 10, 10, 5, 15, 8, 9, 4, 12, 4, 3, 5, 1, 4, 13, 9, 4, 0, 6, 8, 7, 13, 10, 15, 10, 10, 5, 10, 13, 0, 4, 14, 10, 7, 8, 10, 3, 11, 0, 0, 8, 0, 3, 1, 9, 3, 7, 0, 14, 4, 5, 4, 6, 0, 2, 13, 2, 16}, + []byte{9, 7}, + []byte{9, 7, 8, 2, 11, 11, 0, 0, 6, 1, 7, 4, 14, 13, 0, 1, 4, 12, 5, 9, 14, 6, 14, 14, 14, 3, 8, 1, 12, 6, 14, 1, 0, 11, 12, 9, 3, 0, 4, 2, 2, 6, 14, 13, 11, 9, 9, 14, 13, 13, 6, 15, 8, 14, 9, 0, 4, 1, 14, 9, 13, 9, 10, 7, 16}, + []byte{9, 9}, + []byte{9, 9, 2, 4, 7, 0, 11, 3, 14, 5, 2, 12, 9, 4, 15, 7, 11, 13, 5, 13, 4, 9, 6, 2, 10, 1, 7, 9, 8, 10, 4, 1, 4, 2, 5, 11, 14, 10, 7, 4, 10, 13, 0, 8, 7, 10, 7, 15, 5, 3, 10, 14, 11, 11, 7, 8, 5, 4, 0, 1, 13, 15, 3, 13, 16}, + []byte{9, 14}, + []byte{9, 14, 14, 4, 0, 13, 12, 11, 12, 4, 9, 7, 4, 6, 14, 3, 1, 10, 7, 5, 4, 1, 5, 5, 5, 1, 5, 10, 10, 10, 2, 3, 2, 11, 15, 0, 11, 13, 11, 15, 13, 5, 10, 7, 10, 11, 7, 7, 14, 10, 9, 12, 13, 3, 9, 15, 4, 11, 7, 2, 8, 2, 10, 1, 16}, + []byte{9, 15}, + []byte{9, 15, 0}, + []byte{9, 15, 0, 13, 11, 10, 14, 12, 12, 6, 5, 8, 1, 12, 15, 11, 11, 5, 7, 12, 13, 6, 12, 6, 15, 5, 0, 14, 2, 4, 12, 2, 3, 10, 13, 4, 15, 12, 13, 15, 2, 2, 8, 1, 4, 0, 12, 0, 12, 11, 5, 1, 10, 8, 10, 4, 14, 13, 15, 5, 13, 0, 11, 0, 16}, + []byte{9, 15, 4}, + []byte{9, 15, 4, 14, 6, 0, 1, 2, 3, 13, 11, 2, 3, 14, 3, 15, 3, 0, 5, 5, 15, 7, 5, 0, 8, 7, 2, 4, 8, 15, 13, 5, 9, 2, 3, 13, 4, 6, 9, 14, 7, 6, 13, 3, 4, 4, 13, 2, 8, 11, 4, 15, 2, 4, 10, 4, 4, 9, 12, 10, 6, 3, 9, 8, 16}, + []byte{9, 15, 10}, + []byte{9, 15, 10, 9, 5, 13, 1, 0, 7, 3, 2, 15, 3, 4, 3, 6, 5, 15, 3, 4, 15, 5, 10, 2, 15, 7, 7, 0, 2, 10, 9, 13, 10, 14, 4, 0, 12, 5, 8, 3, 1, 0, 5, 12, 4, 0, 9, 2, 1, 10, 5, 0, 5, 2, 13, 12, 10, 1, 15, 9, 15, 7, 9, 3, 16}, + []byte{10}, + []byte{10, 0}, + []byte{10, 0, 9}, + []byte{10, 0, 9, 2, 12, 3, 15, 3, 6, 1, 3, 5, 15, 7, 9, 12, 5, 7, 10, 10, 5, 6, 8, 3, 13, 9, 7, 14, 5, 13, 5, 7, 5, 0, 12, 3, 7, 13, 0, 11, 13, 0, 10, 13, 10, 2, 1, 5, 14, 9, 10, 9, 6, 8, 5, 6, 12, 5, 6, 13, 7, 14, 9, 1, 16}, + []byte{10, 0, 10}, + []byte{10, 0, 10, 2, 2, 2, 2, 6, 15, 8, 5, 3, 7, 1, 11, 5, 14, 5, 14, 4, 1, 7, 3, 11, 3, 3, 10, 1, 11, 9, 6, 2, 9, 13, 7, 4, 5, 9, 6, 1, 15, 3, 6, 14, 9, 11, 0, 5, 1, 0, 12, 5, 9, 1, 15, 1, 1, 14, 3, 13, 13, 9, 5, 11, 16}, + []byte{10, 0, 15}, + []byte{10, 0, 15, 1, 13, 13, 12, 6, 14, 3, 10, 10, 13, 6, 9, 1, 0, 9, 14, 0, 14, 8, 12, 5, 13, 1, 5, 14, 8, 8, 0, 0, 14, 2, 2, 0, 11, 1, 9, 2, 15, 8, 5, 15, 3, 6, 9, 14, 0, 11, 14, 15, 5, 12, 15, 8, 5, 8, 13, 12, 12, 15, 9, 10, 16}, + []byte{10, 2}, + []byte{10, 2, 1, 6, 12, 0, 10, 4, 7, 11, 1, 2, 12, 2, 0, 13, 5, 10, 12, 5, 12, 3, 8, 1, 4, 6, 4, 10, 8, 9, 5, 2, 1, 13, 8, 11, 0, 12, 1, 10, 5, 12, 11, 3, 2, 8, 10, 14, 10, 11, 11, 2, 9, 11, 7, 0, 11, 12, 3, 3, 4, 7, 13, 4, 16}, + []byte{10, 3}, + []byte{10, 3, 11, 4, 1, 12, 1, 3, 15, 6, 14, 1, 6, 15, 13, 2, 2, 4, 2, 10, 4, 3, 11, 0, 4, 1, 12, 15, 13, 1, 15, 0, 2, 12, 11, 11, 4, 12, 15, 0, 6, 9, 4, 3, 13, 1, 4, 3, 6, 5, 11, 11, 8, 15, 0, 10, 3, 0, 15, 15, 5, 0, 7, 10, 16}, + []byte{10, 6}, + []byte{10, 6, 2, 14, 9, 13, 12, 1, 5, 10, 3, 5, 12, 1, 10, 11, 9, 13, 0, 10, 12, 4, 3, 4, 5, 11, 1, 15, 0, 2, 15, 13, 8, 14, 8, 0, 7, 0, 8, 8, 3, 10, 3, 3, 6, 5, 1, 12, 0, 12, 1, 4, 3, 11, 2, 5, 8, 2, 7, 0, 8, 2, 6, 8, 16}, + []byte{10, 8}, + []byte{10, 8, 7, 6, 13, 10, 5, 1, 8, 10, 3, 9, 3, 13, 11, 13, 0, 6, 7, 13, 12, 7, 2, 10, 11, 15, 10, 0, 8, 13, 4, 7, 5, 14, 13, 6, 4, 4, 7, 15, 12, 10, 9, 6, 13, 9, 2, 14, 12, 3, 15, 9, 14, 7, 14, 11, 10, 5, 0, 3, 12, 10, 6, 1, 16}, + []byte{10, 9}, + []byte{10, 9, 3, 13, 11, 8, 6, 1, 1, 14, 8, 13, 0, 12, 1, 5, 9, 14, 11, 7, 2, 4, 13, 2, 10, 14, 10, 7, 2, 7, 6, 3, 13, 15, 11, 5, 10, 6, 9, 0, 9, 10, 8, 5, 1, 6, 4, 6, 7, 12, 7, 9, 13, 0, 3, 8, 6, 13, 6, 1, 10, 5, 1, 1, 16}, + []byte{10, 10}, + []byte{10, 10, 5}, + []byte{10, 10, 5, 4, 6, 8, 1, 7, 13, 10, 11, 15, 15, 12, 9, 12, 4, 2, 4, 9, 8, 3, 0, 10, 0, 10, 15, 5, 12, 15, 4, 3, 12, 6, 14, 12, 14, 6, 5, 6, 2, 7, 2, 0, 9, 9, 0, 7, 3, 6, 1, 9, 9, 14, 5, 7, 0, 15, 6, 2, 1, 13, 7, 12, 16}, + []byte{10, 10, 8}, + []byte{10, 10, 8, 13, 9, 12, 9, 4, 7, 7, 7, 1, 6, 3, 2, 10, 6, 4, 5, 12, 6, 7, 6, 5, 5, 5, 9, 5, 11, 6, 1, 13, 10, 7, 2, 8, 3, 7, 11, 15, 10, 9, 7, 15, 3, 0, 15, 4, 1, 7, 13, 11, 10, 14, 13, 8, 2, 15, 2, 15, 1, 1, 12, 3, 16}, + []byte{10, 13}, + []byte{10, 13, 0}, + []byte{10, 13, 0, 0, 12, 15, 4, 13, 7, 13, 11, 5, 2, 3, 15, 2, 0, 11, 5, 0, 0, 0, 11, 13, 1, 4, 6, 9, 10, 1, 1, 13, 7, 0, 11, 7, 3, 15, 14, 10, 13, 13, 3, 6, 5, 7, 8, 10, 11, 13, 11, 9, 15, 3, 5, 5, 8, 11, 13, 13, 3, 6, 7, 4, 16}, + []byte{10, 13, 13}, + []byte{10, 13, 13, 11, 0, 13, 4, 11, 1, 4, 7, 4, 9, 11, 11, 4, 11, 5, 12, 13, 8, 5, 8, 15, 2, 9, 10, 4, 11, 4, 2, 2, 5, 1, 3, 8, 12, 3, 9, 5, 3, 0, 9, 0, 12, 14, 4, 5, 2, 0, 4, 4, 5, 8, 13, 12, 13, 5, 3, 7, 4, 9, 14, 4, 16}, + []byte{10, 14}, + []byte{10, 14, 4}, + []byte{10, 14, 4, 9, 15, 4, 4, 1, 7, 0, 4, 8, 12, 10, 12, 12, 0, 1, 7, 1, 6, 10, 2, 13, 8, 0, 4, 15, 6, 9, 9, 13, 8, 14, 12, 3, 4, 14, 10, 13, 7, 3, 5, 14, 1, 12, 6, 1, 6, 0, 4, 9, 9, 6, 10, 12, 3, 7, 15, 3, 5, 1, 5, 7, 16}, + []byte{10, 14, 11}, + []byte{10, 14, 11, 8}, + []byte{10, 14, 11, 8, 6, 8, 12, 12, 8, 12, 13, 0, 0, 0, 1, 6, 7, 10, 15, 8, 11, 0, 15, 4, 13, 10, 13, 13, 2, 14, 3, 4, 8, 14, 5, 4, 3, 10, 0, 1, 9, 12, 13, 0, 11, 1, 3, 1, 2, 13, 11, 14, 13, 14, 11, 4, 14, 12, 13, 12, 5, 9, 2, 10, 16}, + []byte{10, 14, 11, 14}, + []byte{10, 14, 11, 14, 9, 9, 7, 3, 15, 12, 4, 8, 4, 9, 10, 2, 7, 5, 2, 1, 12, 2, 10, 7, 1, 10, 10, 11, 7, 6, 7, 3, 13, 13, 10, 11, 8, 3, 12, 12, 8, 8, 14, 9, 1, 10, 11, 14, 12, 6, 7, 5, 12, 1, 12, 4, 7, 1, 10, 11, 15, 9, 2, 7, 16}, + []byte{10, 15}, + []byte{10, 15, 0, 3, 1, 7, 5, 4, 4, 4, 13, 12, 4, 3, 12, 12, 3, 3, 3, 9, 1, 12, 4, 12, 4, 0, 1, 0, 14, 10, 12, 1, 5, 13, 4, 0, 1, 11, 2, 14, 11, 5, 15, 15, 12, 7, 11, 12, 7, 7, 8, 10, 11, 14, 3, 7, 2, 15, 2, 8, 12, 14, 3, 7, 16}, + []byte{11}, + []byte{11, 0}, + []byte{11, 0, 2}, + []byte{11, 0, 2, 12, 4, 13, 5, 8, 10, 3, 8, 0, 0, 13, 9, 3, 15, 9, 5, 15, 2, 14, 11, 4, 8, 5, 0, 11, 3, 13, 2, 4, 2, 7, 5, 6, 11, 15, 1, 12, 10, 3, 0, 9, 9, 11, 12, 4, 3, 9, 0, 7, 10, 15, 6, 13, 15, 15, 0, 11, 15, 3, 3, 7, 16}, + []byte{11, 0, 15}, + []byte{11, 0, 15, 14, 1, 8, 14, 5, 1, 0, 15, 6, 9, 5, 13, 11, 15, 2, 4, 10, 13, 5, 6, 15, 11, 3, 11, 6, 4, 7, 10, 10, 0, 9, 15, 8, 14, 1, 9, 0, 2, 1, 10, 11, 14, 8, 0, 6, 8, 6, 10, 6, 6, 10, 2, 14, 6, 5, 3, 12, 11, 1, 2, 13, 16}, + []byte{11, 1}, + []byte{11, 1, 4, 13, 9, 15, 13, 12, 6, 5, 7, 13, 7, 1, 2, 2, 0, 8, 13, 6, 14, 7, 12, 2, 12, 15, 11, 15, 6, 2, 15, 7, 10, 13, 7, 11, 10, 1, 11, 15, 15, 15, 2, 14, 6, 3, 14, 6, 12, 10, 14, 14, 2, 11, 0, 11, 15, 5, 11, 10, 13, 0, 15, 13, 16}, + []byte{11, 2}, + []byte{11, 2, 5, 9, 3, 9, 8, 6, 7, 9, 9, 4, 12, 13, 8, 14, 5, 10, 1, 8, 15, 3, 4, 1, 6, 2, 8, 4, 2, 0, 15, 10, 8, 10, 11, 8, 8, 11, 2, 15, 5, 13, 0, 5, 15, 15, 14, 5, 1, 2, 9, 1, 6, 5, 4, 9, 2, 2, 15, 5, 4, 5, 4, 15, 16}, + []byte{11, 3}, + []byte{11, 3, 1, 11, 10, 6, 13, 5, 7, 6, 13, 11, 13, 14, 0, 5, 4, 2, 13, 3, 0, 10, 9, 2, 6, 4, 14, 2, 12, 7, 1, 11, 14, 2, 7, 0, 14, 3, 14, 11, 4, 15, 5, 9, 1, 0, 5, 6, 7, 10, 8, 12, 1, 12, 0, 6, 1, 9, 10, 2, 14, 5, 14, 12, 16}, + []byte{11, 4}, + []byte{11, 4, 1, 0, 8, 9, 14, 5, 2, 9, 12, 1, 15, 15, 6, 12, 4, 13, 6, 5, 8, 3, 14, 12, 15, 12, 10, 7, 14, 10, 6, 4, 1, 9, 11, 15, 3, 9, 14, 0, 13, 4, 1, 8, 6, 8, 6, 11, 11, 7, 10, 2, 4, 4, 2, 4, 12, 6, 7, 0, 11, 3, 3, 2, 16}, + []byte{11, 5}, + []byte{11, 5, 3, 15, 6, 11, 12, 8, 1, 14, 12, 15, 10, 15, 0, 12, 15, 4, 12, 3, 13, 12, 13, 9, 5, 2, 7, 14, 3, 12, 0, 15, 6, 9, 1, 0, 3, 8, 3, 10, 12, 15, 9, 6, 4, 14, 13, 1, 4, 11, 1, 9, 4, 15, 10, 6, 6, 0, 13, 3, 0, 11, 1, 0, 16}, + []byte{11, 7}, + []byte{11, 7, 12}, + []byte{11, 7, 12, 8, 12, 2, 7, 3, 10, 15, 6, 7, 5, 6, 1, 2, 11, 12, 8, 14, 14, 6, 8, 12, 7, 10, 4, 1, 9, 11, 6, 7, 1, 14, 6, 7, 8, 14, 6, 3, 15, 11, 9, 14, 13, 6, 2, 6, 4, 6, 3, 5, 8, 13, 7, 0, 10, 13, 11, 8, 2, 4, 3, 4, 16}, + []byte{11, 7, 15}, + []byte{11, 7, 15, 12, 8, 11, 1, 12, 12, 0, 5, 5, 13, 13, 9, 4, 10, 0, 15, 5, 9, 8, 15, 5, 12, 14, 4, 15, 8, 14, 1, 2, 1, 10, 8, 14, 3, 14, 4, 10, 12, 7, 5, 2, 11, 0, 2, 7, 11, 10, 3, 14, 2, 14, 9, 9, 14, 13, 1, 0, 12, 7, 11, 8, 16}, + []byte{11, 8}, + []byte{11, 8, 8}, + []byte{11, 8, 8, 6, 4, 12, 11, 7, 12, 6, 2, 1, 5, 14, 9, 9, 15, 15, 14, 5, 13, 11, 7, 11, 2, 2, 11, 3, 1, 2, 9, 14, 9, 3, 11, 9, 10, 3, 8, 11, 9, 11, 5, 4, 1, 9, 3, 10, 0, 14, 3, 13, 7, 12, 8, 2, 5, 1, 6, 5, 7, 1, 7, 3, 16}, + []byte{11, 8, 15}, + []byte{11, 8, 15, 3, 7, 10, 6, 1, 12, 2, 6, 13, 3, 8, 8, 3, 0, 6, 10, 13, 9, 13, 14, 14, 2, 5, 14, 7, 2, 10, 10, 8, 6, 10, 4, 9, 9, 0, 3, 10, 1, 15, 11, 11, 14, 6, 2, 0, 5, 2, 1, 1, 11, 4, 7, 13, 1, 15, 3, 9, 15, 7, 7, 15, 16}, + []byte{11, 9}, + []byte{11, 9, 10, 15, 7, 2, 15, 12, 0, 5, 3, 4, 10, 4, 10, 5, 10, 9, 4, 14, 11, 1, 15, 6, 4, 12, 11, 1, 11, 13, 6, 12, 4, 2, 5, 10, 12, 11, 10, 3, 2, 4, 9, 15, 11, 8, 4, 4, 1, 14, 7, 4, 1, 1, 14, 9, 11, 14, 9, 14, 12, 1, 15, 3, 16}, + []byte{11, 11}, + []byte{11, 11, 6, 2, 14, 8, 13, 8, 13, 0, 14, 11, 3, 13, 7, 4, 3, 2, 7, 5, 8, 12, 2, 4, 4, 1, 3, 1, 15, 1, 6, 4, 9, 8, 7, 4, 3, 6, 7, 12, 12, 5, 2, 10, 4, 15, 10, 4, 15, 13, 0, 6, 0, 9, 13, 14, 15, 9, 14, 5, 7, 3, 8, 9, 16}, + []byte{11, 12}, + []byte{11, 12, 0, 12, 11, 5, 9, 1, 10, 6, 7, 8, 2, 2, 14, 8, 8, 13, 12, 14, 11, 11, 8, 9, 9, 1, 11, 12, 10, 5, 11, 7, 3, 0, 5, 11, 5, 8, 5, 8, 13, 6, 5, 11, 12, 2, 11, 5, 14, 6, 6, 0, 5, 14, 4, 8, 1, 10, 6, 5, 0, 5, 8, 8, 16}, + []byte{11, 13}, + []byte{11, 13, 13, 14, 12, 6, 5, 1, 6, 5, 2, 14, 0, 10, 10, 1, 7, 14, 0, 5, 6, 13, 14, 1, 7, 9, 0, 5, 5, 4, 10, 14, 12, 10, 5, 15, 10, 2, 4, 8, 12, 14, 12, 12, 4, 1, 3, 1, 13, 1, 8, 9, 13, 10, 12, 13, 2, 6, 12, 4, 12, 10, 5, 5, 16}, + []byte{11, 14}, + []byte{11, 14, 0}, + []byte{11, 14, 0, 1}, + []byte{11, 14, 0, 1, 7, 7, 1, 0, 13, 6, 11, 15, 11, 0, 10, 12, 7, 10, 8, 13, 1, 4, 0, 3, 3, 3, 1, 2, 7, 5, 7, 1, 8, 0, 9, 14, 10, 15, 2, 11, 5, 9, 0, 9, 0, 0, 15, 1, 6, 8, 5, 4, 5, 13, 10, 14, 10, 3, 8, 6, 5, 15, 6, 0, 16}, + []byte{11, 14, 0, 3}, + []byte{11, 14, 0, 3, 15, 5, 0, 13, 5, 8, 15, 14, 14, 6, 9, 1, 2, 13, 13, 11, 6, 12, 13, 15, 13, 5, 12, 2, 6, 3, 0, 2, 13, 11, 9, 4, 12, 9, 8, 6, 10, 13, 6, 9, 14, 11, 4, 14, 7, 15, 11, 3, 2, 7, 6, 8, 6, 3, 6, 11, 12, 9, 14, 6, 16}, + []byte{11, 14, 8}, + []byte{11, 14, 8, 15, 0, 10, 3, 13, 1, 12, 2, 13, 7, 10, 0, 15, 12, 2, 3, 4, 2, 15, 9, 10, 4, 12, 7, 8, 14, 0, 0, 15, 14, 3, 8, 10, 7, 15, 2, 6, 13, 10, 3, 4, 5, 7, 5, 8, 12, 11, 2, 11, 8, 14, 15, 13, 0, 5, 2, 11, 12, 13, 5, 5, 16}, + []byte{11, 14, 13}, + []byte{11, 14, 13, 10, 4, 11, 3, 4, 6, 7, 4, 15, 3, 11, 9, 13, 0, 10, 10, 15, 6, 12, 3, 9, 4, 6, 12, 0, 5, 11, 7, 3, 11, 4, 14, 7, 10, 12, 6, 8, 0, 12, 7, 0, 8, 4, 13, 4, 1, 13, 12, 8, 15, 0, 11, 13, 3, 11, 11, 3, 8, 0, 3, 1, 16}, + []byte{12}, + []byte{12, 0}, + []byte{12, 0, 0}, + []byte{12, 0, 0, 12, 2, 8, 10, 6, 11, 15, 14, 2, 8, 2, 9, 6, 1, 3, 4, 3, 2, 10, 2, 12, 2, 1, 14, 14, 15, 12, 2, 5, 13, 10, 5, 11, 10, 13, 9, 8, 3, 12, 5, 4, 3, 0, 12, 10, 2, 8, 11, 12, 1, 10, 9, 2, 13, 2, 11, 6, 5, 14, 12, 5, 16}, + []byte{12, 0, 1}, + []byte{12, 0, 1, 3}, + []byte{12, 0, 1, 3, 1, 8, 10, 12, 6, 14, 0, 13, 2, 12, 12, 0, 8, 4, 6, 8, 10, 11, 12, 1, 13, 15, 6, 15, 2, 12, 9, 14, 12, 3, 15, 12, 5, 12, 15, 11, 15, 14, 5, 14, 15, 14, 12, 8, 3, 10, 10, 11, 2, 5, 0, 12, 15, 12, 8, 3, 14, 15, 3, 15, 16}, + []byte{12, 0, 1, 11}, + []byte{12, 0, 1, 11, 3, 8, 5, 7, 9, 4, 6, 12, 11, 7, 7, 10, 15, 9, 15, 11, 0, 9, 3, 9, 4, 12, 4, 10, 3, 5, 9, 15, 11, 10, 6, 13, 15, 2, 0, 2, 12, 7, 7, 13, 3, 14, 0, 7, 14, 5, 3, 1, 7, 7, 15, 3, 15, 1, 8, 10, 5, 5, 15, 2, 16}, + []byte{12, 0, 15}, + []byte{12, 0, 15, 4, 15, 13, 14, 4, 7, 4, 1, 8, 1, 15, 12, 10, 3, 13, 1, 15, 11, 6, 14, 0, 13, 12, 1, 1, 8, 10, 7, 1, 4, 5, 7, 15, 14, 7, 12, 12, 5, 13, 4, 15, 1, 14, 4, 2, 6, 12, 9, 2, 14, 1, 7, 6, 7, 14, 11, 8, 8, 5, 10, 0, 16}, + []byte{12, 2}, + []byte{12, 2, 9}, + []byte{12, 2, 9, 1, 1, 11, 7, 5, 11, 14, 7, 13, 3, 15, 13, 11, 9, 4, 4, 2, 11, 9, 0, 0, 12, 10, 8, 15, 7, 2, 0, 5, 13, 6, 13, 5, 2, 15, 13, 11, 3, 5, 0, 5, 14, 7, 7, 14, 10, 8, 6, 7, 6, 15, 8, 1, 1, 10, 6, 13, 5, 14, 10, 1, 16}, + []byte{12, 2, 12}, + []byte{12, 2, 12, 15, 8, 14, 0, 5, 4, 5, 0, 11, 14, 6, 13, 2, 12, 9, 8, 14, 13, 12, 5, 13, 15, 2, 1, 9, 10, 4, 12, 11, 13, 8, 6, 13, 12, 6, 0, 6, 6, 7, 11, 4, 10, 7, 8, 1, 0, 2, 5, 7, 1, 7, 7, 13, 12, 7, 3, 2, 1, 7, 14, 13, 16}, + []byte{12, 4}, + []byte{12, 4, 9, 2, 4, 1, 8, 2, 9, 4, 4, 6, 10, 13, 5, 7, 0, 11, 5, 11, 9, 7, 13, 3, 8, 10, 5, 0, 4, 7, 8, 2, 10, 6, 5, 2, 2, 2, 0, 4, 12, 6, 7, 13, 5, 15, 2, 9, 11, 6, 1, 5, 1, 5, 2, 4, 6, 13, 0, 4, 1, 0, 13, 12, 16}, + []byte{12, 5}, + []byte{12, 5, 7, 9, 7, 5, 10, 14, 6, 9, 0, 15, 9, 10, 6, 5, 5, 4, 0, 1, 5, 4, 5, 9, 13, 11, 6, 12, 1, 3, 14, 8, 12, 6, 13, 11, 15, 6, 14, 4, 12, 12, 0, 15, 5, 12, 15, 9, 8, 6, 10, 15, 13, 1, 2, 1, 0, 12, 2, 3, 3, 10, 11, 15, 16}, + []byte{12, 6}, + []byte{12, 6, 0}, + []byte{12, 6, 0, 15, 7, 0, 6, 9, 9, 0, 4, 2, 4, 7, 7, 7, 2, 7, 14, 7, 2, 3, 0, 15, 6, 4, 11, 5, 12, 9, 4, 13, 8, 13, 12, 11, 2, 12, 7, 8, 1, 5, 15, 8, 12, 2, 5, 4, 2, 7, 2, 2, 15, 12, 14, 15, 9, 0, 0, 13, 13, 2, 3, 8, 16}, + []byte{12, 6, 4}, + []byte{12, 6, 4, 7, 4, 1, 1, 0, 14, 13, 14, 14, 15, 5, 9, 12, 4, 8, 8, 4, 1, 11, 3, 5, 10, 14, 13, 3, 7, 0, 5, 7, 15, 14, 11, 2, 1, 1, 14, 7, 3, 8, 1, 2, 4, 2, 8, 5, 10, 2, 3, 3, 14, 7, 7, 14, 5, 3, 1, 5, 2, 10, 5, 7, 16}, + []byte{12, 6, 14}, + []byte{12, 6, 14, 7, 15, 2, 14, 15, 7, 5, 8, 5, 1, 10, 2, 11, 7, 5, 2, 14, 11, 2, 4, 7, 11, 5, 7, 0, 1, 10, 10, 5, 15, 2, 4, 13, 0, 12, 8, 6, 7, 5, 3, 4, 3, 3, 0, 12, 7, 4, 12, 5, 1, 12, 1, 10, 14, 9, 1, 3, 1, 9, 15, 7, 16}, + []byte{12, 7}, + []byte{12, 7, 0}, + []byte{12, 7, 0, 5, 6, 1, 9, 14, 11, 7, 10, 9, 7, 10, 0, 1, 13, 2, 4, 14, 2, 1, 12, 13, 10, 9, 8, 0, 6, 6, 13, 4, 0, 10, 14, 11, 6, 13, 6, 12, 14, 6, 15, 11, 9, 14, 9, 10, 4, 8, 8, 0, 13, 8, 6, 15, 14, 4, 4, 3, 2, 11, 1, 3, 16}, + []byte{12, 7, 12}, + []byte{12, 7, 12, 10, 10, 9, 0, 7, 4, 4, 15, 6, 11, 0, 14, 1, 15, 10, 13, 15, 12, 5, 12, 2, 1, 12, 12, 12, 5, 13, 14, 0, 0, 5, 7, 4, 4, 7, 13, 6, 1, 6, 0, 8, 3, 5, 14, 3, 5, 14, 2, 5, 10, 8, 2, 15, 12, 3, 9, 1, 13, 0, 5, 1, 16}, + []byte{12, 7, 13}, + []byte{12, 7, 13, 13, 5, 10, 11, 8, 1, 13, 7, 7, 5, 13, 5, 12, 8, 11, 2, 8, 3, 13, 13, 15, 7, 8, 7, 11, 12, 8, 8, 12, 6, 1, 14, 7, 6, 6, 11, 7, 11, 4, 1, 8, 12, 0, 13, 6, 3, 7, 5, 6, 8, 3, 15, 5, 9, 15, 14, 6, 14, 5, 10, 9, 16}, + []byte{12, 9}, + []byte{12, 9, 3, 14, 1, 8, 3, 10, 9, 13, 13, 0, 9, 12, 13, 13, 4, 4, 12, 10, 2, 10, 9, 14, 11, 6, 11, 9, 4, 15, 9, 7, 0, 15, 8, 15, 10, 3, 0, 9, 11, 0, 15, 9, 12, 15, 13, 8, 2, 3, 5, 7, 2, 12, 2, 3, 10, 10, 13, 5, 8, 15, 11, 2, 16}, + []byte{12, 11}, + []byte{12, 11, 4, 4, 2, 9, 7, 9, 5, 8, 12, 8, 2, 15, 14, 8, 0, 15, 11, 8, 8, 2, 15, 2, 12, 8, 10, 0, 8, 5, 10, 3, 8, 5, 5, 6, 2, 4, 7, 11, 3, 12, 3, 15, 6, 6, 5, 14, 12, 10, 3, 8, 2, 13, 2, 7, 14, 2, 6, 14, 3, 11, 11, 12, 16}, + []byte{12, 12}, + []byte{12, 12, 14, 4, 6, 2, 0, 4, 11, 10, 10, 8, 6, 15, 7, 3, 3, 10, 11, 15, 2, 0, 8, 11, 3, 5, 8, 11, 10, 8, 11, 8, 0, 7, 0, 8, 1, 13, 6, 13, 4, 6, 10, 4, 0, 7, 7, 4, 5, 2, 3, 8, 10, 14, 15, 2, 12, 1, 3, 3, 15, 13, 4, 13, 16}, + []byte{13}, + []byte{13, 2}, + []byte{13, 2, 0}, + []byte{13, 2, 0, 7, 11, 0, 5, 11, 6, 8, 4, 11, 10, 1, 8, 3, 6, 1, 13, 15, 8, 14, 8, 1, 14, 8, 4, 6, 13, 1, 0, 3, 6, 5, 15, 15, 12, 15, 0, 4, 15, 7, 8, 4, 0, 4, 0, 3, 12, 5, 11, 10, 12, 15, 7, 7, 10, 13, 13, 4, 12, 5, 0, 15, 16}, + []byte{13, 2, 2}, + []byte{13, 2, 2, 2, 1, 2, 5, 7, 2, 4, 11, 9, 13, 15, 1, 15, 4, 10, 9, 2, 14, 1, 2, 8, 4, 13, 11, 12, 8, 7, 1, 10, 9, 1, 5, 6, 12, 2, 5, 3, 5, 7, 2, 13, 15, 0, 10, 3, 8, 10, 14, 1, 4, 6, 10, 12, 0, 3, 11, 6, 2, 10, 15, 4, 16}, + []byte{13, 2, 4}, + []byte{13, 2, 4, 14, 8, 15, 15, 15, 2, 0, 12, 5, 3, 1, 7, 0, 7, 4, 12, 5, 4, 15, 13, 5, 4, 12, 10, 9, 15, 1, 15, 12, 8, 15, 14, 15, 3, 6, 11, 11, 7, 0, 12, 4, 4, 11, 5, 5, 15, 9, 0, 10, 7, 0, 12, 6, 2, 1, 11, 9, 1, 15, 9, 10, 16}, + []byte{13, 3}, + []byte{13, 3, 7}, + []byte{13, 3, 7, 4, 7, 6, 10, 1, 7, 8, 14, 14, 6, 8, 11, 0, 2, 11, 3, 13, 14, 0, 14, 13, 14, 14, 1, 14, 11, 11, 5, 7, 14, 1, 6, 3, 8, 14, 14, 11, 15, 5, 8, 11, 3, 14, 2, 5, 6, 3, 2, 2, 14, 0, 13, 10, 1, 1, 8, 9, 15, 2, 7, 2, 16}, + []byte{13, 3, 10}, + []byte{13, 3, 10, 7, 14, 5, 9, 15, 8, 8, 8, 10, 7, 10, 12, 0, 7, 10, 2, 1, 1, 12, 7, 1, 7, 12, 0, 7, 11, 8, 2, 9, 7, 0, 13, 9, 4, 5, 9, 7, 15, 6, 3, 6, 5, 12, 15, 8, 12, 9, 3, 13, 5, 1, 10, 12, 9, 13, 4, 5, 12, 5, 9, 7, 16}, + []byte{13, 5}, + []byte{13, 5, 2, 6, 8, 8, 10, 8, 15, 9, 2, 6, 12, 8, 1, 6, 12, 10, 1, 14, 0, 7, 9, 0, 6, 7, 12, 10, 11, 10, 9, 4, 4, 15, 1, 5, 8, 14, 7, 6, 4, 8, 1, 7, 11, 8, 3, 15, 12, 4, 3, 5, 9, 4, 3, 7, 0, 12, 10, 9, 12, 15, 6, 2, 16}, + []byte{13, 8}, + []byte{13, 8, 1}, + []byte{13, 8, 1, 12, 5, 13, 5, 5, 9, 11, 10, 8, 7, 0, 14, 9, 0, 10, 2, 11, 6, 1, 7, 12, 15, 0, 5, 4, 2, 6, 9, 5, 14, 9, 10, 6, 2, 6, 6, 1, 9, 11, 5, 9, 1, 4, 8, 11, 4, 0, 2, 9, 5, 10, 0, 11, 10, 5, 5, 12, 10, 6, 6, 14, 16}, + []byte{13, 8, 15}, + []byte{13, 8, 15, 15, 12, 11, 12, 0, 11, 14, 3, 8, 3, 0, 6, 14, 5, 3, 9, 13, 10, 6, 1, 6, 1, 6, 1, 12, 6, 4, 14, 15, 7, 11, 12, 0, 15, 0, 2, 8, 1, 13, 6, 2, 14, 5, 2, 9, 6, 11, 12, 8, 14, 11, 6, 14, 10, 7, 0, 9, 12, 11, 0, 11, 16}, + []byte{13, 9}, + []byte{13, 9, 0}, + []byte{13, 9, 0, 11, 12, 13, 14, 12, 11, 4, 4, 10, 3, 4, 0, 2, 14, 2, 10, 1, 11, 5, 13, 3, 10, 3, 2, 1, 11, 5, 1, 14, 4, 1, 5, 14, 2, 9, 8, 14, 11, 10, 12, 10, 3, 12, 9, 5, 13, 9, 1, 4, 4, 3, 10, 13, 12, 0, 3, 15, 6, 12, 14, 12, 16}, + []byte{13, 9, 14}, + []byte{13, 9, 14, 13, 3, 5, 8, 5, 2, 6, 5, 0, 15, 2, 8, 13, 7, 10, 8, 15, 7, 3, 12, 7, 11, 10, 4, 9, 11, 12, 13, 7, 2, 13, 9, 7, 14, 13, 15, 8, 13, 7, 3, 1, 7, 9, 7, 14, 5, 10, 2, 7, 2, 8, 5, 5, 9, 11, 8, 6, 5, 5, 5, 2, 16}, + []byte{13, 10}, + []byte{13, 10, 0, 13, 7, 15, 12, 0, 5, 12, 3, 2, 11, 11, 11, 10, 1, 6, 5, 1, 8, 15, 9, 15, 2, 9, 3, 6, 15, 13, 7, 5, 1, 4, 0, 13, 5, 12, 9, 9, 11, 9, 5, 10, 14, 5, 3, 6, 2, 0, 5, 11, 10, 9, 12, 10, 15, 1, 8, 6, 8, 3, 7, 8, 16}, + []byte{13, 12}, + []byte{13, 12, 8}, + []byte{13, 12, 8, 8, 2, 9, 2, 6, 1, 11, 6, 11, 15, 13, 5, 3, 10, 11, 7, 13, 10, 10, 12, 3, 0, 5, 12, 2, 10, 13, 0, 14, 13, 1, 5, 4, 2, 3, 2, 3, 4, 1, 2, 8, 11, 13, 12, 5, 11, 8, 6, 10, 2, 14, 9, 14, 10, 15, 6, 1, 5, 7, 14, 4, 16}, + []byte{13, 12, 11}, + []byte{13, 12, 11, 10, 13, 7, 10, 12, 12, 8, 15, 15, 4, 11, 11, 5, 5, 6, 2, 13, 12, 1, 10, 3, 7, 14, 8, 7, 2, 4, 4, 13, 15, 1, 1, 14, 13, 7, 5, 4, 15, 8, 15, 2, 5, 14, 11, 11, 6, 15, 12, 2, 3, 3, 2, 0, 14, 5, 2, 6, 8, 11, 3, 15, 16}, + []byte{13, 13}, + []byte{13, 13, 7}, + []byte{13, 13, 7, 10, 13, 9, 6, 7, 3, 15, 8, 2, 3, 4, 4, 4, 14, 5, 1, 9, 4, 13, 5, 10, 11, 0, 14, 12, 10, 9, 10, 1, 15, 11, 7, 11, 13, 3, 7, 7, 0, 13, 0, 15, 13, 12, 6, 2, 12, 14, 3, 14, 1, 8, 0, 0, 3, 7, 1, 5, 8, 7, 7, 3, 16}, + []byte{13, 13, 12}, + []byte{13, 13, 12, 4, 8, 10, 15, 11, 13, 11, 1, 6, 6, 1, 12, 8, 7, 8, 9, 11, 4, 4, 7, 15, 5, 8, 1, 10, 14, 0, 7, 14, 11, 1, 8, 6, 3, 11, 2, 4, 14, 5, 0, 8, 6, 5, 13, 15, 10, 12, 10, 12, 15, 0, 10, 14, 15, 7, 10, 4, 15, 9, 13, 12, 16}, + []byte{13, 14}, + []byte{13, 14, 6, 14, 6, 15, 12, 10, 14, 15, 12, 3, 9, 15, 0, 5, 14, 5, 9, 1, 2, 0, 1, 4, 0, 9, 3, 15, 3, 8, 9, 2, 6, 9, 8, 7, 11, 11, 7, 11, 1, 2, 5, 14, 5, 1, 11, 4, 9, 13, 13, 15, 11, 4, 9, 11, 0, 3, 14, 3, 6, 12, 5, 0, 16}, + []byte{14}, + []byte{14, 0}, + []byte{14, 0, 1, 5, 13, 2, 14, 4, 12, 0, 8, 5, 2, 9, 1, 6, 1, 1, 2, 9, 8, 4, 6, 0, 6, 0, 2, 11, 9, 1, 3, 11, 5, 15, 1, 9, 2, 7, 2, 7, 1, 5, 15, 12, 10, 10, 4, 8, 2, 5, 8, 14, 15, 14, 2, 4, 12, 15, 2, 1, 8, 8, 5, 14, 16}, + []byte{14, 1}, + []byte{14, 1, 14, 2, 3, 6, 9, 0, 14, 8, 9, 0, 12, 13, 14, 12, 6, 14, 11, 1, 9, 11, 0, 6, 15, 5, 13, 3, 1, 13, 4, 2, 2, 11, 5, 12, 1, 7, 11, 13, 4, 12, 4, 3, 5, 10, 15, 11, 2, 10, 2, 5, 3, 2, 1, 8, 0, 0, 1, 1, 4, 5, 3, 15, 16}, + []byte{14, 2}, + []byte{14, 2, 2}, + []byte{14, 2, 2, 13, 4, 9, 6, 12, 4, 2, 5, 4, 7, 9, 10, 12, 11, 4, 4, 5, 12, 4, 0, 4, 0, 11, 13, 11, 5, 14, 1, 7, 15, 10, 4, 6, 1, 13, 14, 1, 7, 5, 14, 10, 10, 10, 7, 7, 10, 10, 7, 9, 14, 2, 3, 11, 5, 11, 1, 9, 15, 7, 6, 1, 16}, + []byte{14, 2, 12}, + []byte{14, 2, 12, 8, 11, 11, 15, 9, 6, 2, 12, 3, 0, 10, 15, 14, 9, 12, 3, 5, 14, 9, 13, 7, 14, 0, 3, 6, 14, 15, 4, 9, 6, 11, 5, 2, 12, 11, 7, 7, 0, 12, 6, 4, 5, 10, 7, 6, 15, 2, 12, 14, 14, 5, 15, 8, 8, 1, 1, 10, 9, 8, 3, 0, 16}, + []byte{14, 3}, + []byte{14, 3, 6, 12, 0, 15, 1, 5, 4, 10, 3, 6, 5, 14, 0, 8, 6, 12, 6, 8, 7, 0, 5, 0, 12, 14, 14, 7, 4, 11, 13, 13, 13, 14, 9, 9, 9, 7, 10, 1, 13, 14, 13, 14, 11, 0, 14, 5, 5, 2, 1, 7, 3, 6, 8, 12, 0, 10, 11, 6, 11, 10, 10, 4, 16}, + []byte{14, 4}, + []byte{14, 4, 2, 9, 5, 12, 5, 10, 10, 0, 4, 3, 10, 6, 0, 13, 2, 7, 9, 8, 5, 4, 15, 7, 4, 2, 4, 14, 2, 1, 2, 5, 0, 13, 5, 12, 1, 14, 1, 15, 9, 9, 5, 9, 5, 4, 9, 14, 9, 0, 11, 12, 9, 2, 6, 13, 7, 0, 14, 9, 7, 0, 6, 8, 16}, + []byte{14, 5}, + []byte{14, 5, 5, 11, 7, 3, 4, 13, 15, 3, 5, 10, 11, 6, 13, 5, 7, 6, 6, 0, 7, 14, 0, 1, 12, 4, 2, 15, 2, 1, 13, 2, 7, 5, 12, 13, 9, 12, 0, 15, 8, 6, 15, 11, 11, 3, 1, 0, 0, 2, 4, 1, 10, 1, 4, 11, 10, 0, 12, 7, 6, 7, 2, 15, 16}, + []byte{14, 6}, + []byte{14, 6, 9}, + []byte{14, 6, 9, 0, 11, 2, 3, 9, 11, 10, 3, 10, 10, 15, 9, 9, 3, 14, 4, 4, 3, 10, 14, 1, 4, 10, 14, 15, 15, 12, 4, 4, 12, 15, 8, 13, 9, 9, 3, 1, 10, 7, 9, 11, 10, 14, 13, 9, 15, 10, 1, 4, 1, 13, 0, 14, 4, 5, 0, 6, 14, 1, 3, 1, 16}, + []byte{14, 6, 12}, + []byte{14, 6, 12, 0, 5, 12, 2, 14, 11, 10, 12, 6, 8, 13, 15, 1, 1, 0, 11, 9, 9, 6, 6, 12, 11, 15, 9, 2, 4, 1, 4, 10, 6, 13, 13, 12, 15, 3, 11, 6, 7, 15, 12, 7, 7, 9, 0, 1, 10, 5, 15, 10, 0, 4, 9, 13, 10, 0, 12, 15, 11, 1, 0, 9, 16}, + []byte{14, 7}, + []byte{14, 7, 4}, + []byte{14, 7, 4, 8, 3, 2, 0, 14, 13, 12, 6, 10, 9, 12, 3, 0, 13, 2, 4, 9, 13, 7, 5, 10, 15, 7, 4, 10, 1, 9, 10, 13, 14, 7, 15, 6, 9, 12, 5, 6, 14, 5, 14, 0, 13, 3, 10, 9, 10, 13, 11, 1, 7, 15, 14, 14, 1, 11, 0, 10, 4, 11, 14, 15, 16}, + []byte{14, 7, 12}, + []byte{14, 7, 12, 15, 1, 8, 11, 9, 6, 10, 1, 12, 1, 2, 5, 0, 7, 12, 9, 10, 9, 5, 11, 7, 15, 4, 8, 12, 3, 14, 0, 1, 2, 6, 5, 1, 7, 9, 3, 10, 1, 9, 6, 12, 14, 2, 11, 8, 1, 10, 10, 10, 6, 12, 11, 1, 8, 5, 13, 12, 0, 3, 11, 6, 16}, + []byte{14, 8}, + []byte{14, 8, 3}, + []byte{14, 8, 3, 12, 2, 12, 5, 6, 15, 3, 5, 1, 13, 8, 12, 2, 5, 8, 6, 3, 10, 5, 5, 14, 12, 14, 9, 3, 8, 15, 15, 12, 11, 6, 12, 13, 15, 2, 9, 7, 8, 14, 11, 3, 4, 14, 10, 1, 10, 1, 9, 5, 9, 1, 8, 8, 4, 13, 3, 8, 8, 5, 15, 3, 16}, + []byte{14, 8, 12}, + []byte{14, 8, 12, 0}, + []byte{14, 8, 12, 0, 7, 11, 10, 11, 8, 8, 2, 2, 14, 14, 14, 11, 8, 7, 5, 2, 3, 6, 14, 1, 4, 8, 15, 7, 8, 1, 3, 4, 1, 1, 5, 7, 15, 9, 11, 15, 12, 5, 6, 12, 1, 12, 5, 3, 9, 7, 2, 4, 8, 9, 15, 15, 4, 0, 0, 9, 6, 9, 5, 11, 16}, + []byte{14, 8, 12, 6}, + []byte{14, 8, 12, 6, 11, 4, 1, 0, 14, 2, 9, 8, 4, 11, 14, 3, 11, 14, 13, 9, 10, 8, 4, 11, 7, 6, 15, 11, 11, 13, 6, 4, 7, 15, 5, 15, 10, 5, 6, 14, 6, 5, 14, 3, 6, 12, 2, 6, 4, 9, 0, 3, 2, 7, 5, 10, 10, 2, 2, 12, 13, 11, 0, 13, 16}, + []byte{14, 10}, + []byte{14, 10, 6}, + []byte{14, 10, 6, 7, 4, 14, 6, 0, 3, 15, 6, 0, 11, 10, 1, 14, 2, 5, 2, 4, 1, 9, 13, 8, 6, 13, 0, 4, 8, 5, 15, 13, 3, 15, 4, 6, 12, 10, 6, 10, 11, 11, 15, 4, 12, 6, 5, 10, 15, 14, 14, 0, 10, 9, 11, 10, 2, 9, 0, 5, 9, 6, 5, 5, 16}, + []byte{14, 10, 12}, + []byte{14, 10, 12, 11, 11, 8, 6, 14, 12, 5, 1, 8, 11, 10, 10, 7, 1, 0, 13, 14, 10, 5, 14, 13, 9, 8, 6, 1, 6, 2, 15, 2, 1, 13, 15, 2, 10, 9, 8, 13, 2, 1, 1, 9, 15, 6, 12, 10, 12, 11, 11, 0, 1, 14, 8, 13, 9, 10, 7, 7, 10, 6, 2, 9, 16}, + []byte{14, 11}, + []byte{14, 11, 8}, + []byte{14, 11, 8, 8, 5, 15, 10, 3, 7, 14, 15, 7, 14, 6, 8, 6, 10, 7, 15, 8, 13, 13, 3, 13, 9, 0, 0, 4, 13, 14, 5, 5, 5, 5, 2, 6, 3, 1, 0, 14, 7, 8, 13, 12, 11, 15, 8, 5, 7, 12, 9, 11, 0, 10, 3, 1, 14, 4, 0, 11, 9, 7, 3, 6, 16}, + []byte{14, 11, 13}, + []byte{14, 11, 13, 4, 13, 9, 6, 4, 13, 15, 1, 9, 12, 1, 5, 9, 8, 13, 3, 12, 14, 8, 3, 5, 4, 4, 9, 8, 15, 4, 15, 0, 12, 10, 13, 11, 3, 9, 13, 7, 0, 0, 10, 15, 1, 5, 11, 10, 6, 10, 4, 2, 15, 8, 15, 6, 4, 4, 4, 12, 2, 7, 13, 0, 16}, + []byte{14, 12}, + []byte{14, 12, 10, 6, 12, 13, 13, 9, 7, 6, 8, 0, 9, 0, 15, 9, 0, 9, 6, 0, 12, 15, 9, 11, 10, 13, 4, 7, 7, 0, 5, 12, 10, 3, 11, 1, 9, 10, 5, 4, 12, 8, 14, 12, 8, 1, 8, 6, 14, 2, 9, 8, 7, 15, 15, 13, 13, 3, 10, 8, 4, 3, 5, 11, 16}, + []byte{14, 14}, + []byte{14, 14, 3}, + []byte{14, 14, 3, 1, 7, 10, 7, 2, 12, 6, 6, 0, 4, 14, 9, 14, 4, 10, 11, 12, 11, 10, 1, 10, 13, 9, 13, 6, 1, 5, 9, 10, 0, 0, 13, 9, 1, 6, 8, 5, 5, 8, 11, 14, 8, 1, 9, 14, 4, 3, 9, 3, 9, 3, 6, 10, 10, 1, 14, 14, 14, 4, 3, 2, 16}, + []byte{14, 14, 9}, + []byte{14, 14, 9, 13, 6, 9, 15, 0, 2, 13, 1, 2, 4, 5, 9, 8, 5, 12, 10, 11, 3, 14, 13, 8, 1, 6, 11, 12, 8, 6, 1, 7, 7, 12, 8, 3, 14, 0, 7, 0, 1, 12, 12, 5, 5, 1, 5, 13, 14, 9, 9, 3, 2, 10, 10, 0, 6, 5, 8, 8, 6, 4, 0, 7, 16}, + []byte{15}, + []byte{15, 0}, + []byte{15, 0, 3, 13, 11, 4, 15, 6, 1, 5, 4, 7, 12, 9, 13, 8, 12, 5, 8, 11, 4, 15, 3, 7, 15, 8, 4, 15, 7, 4, 14, 15, 15, 7, 6, 7, 12, 2, 4, 12, 15, 8, 1, 11, 9, 5, 7, 6, 6, 2, 14, 9, 6, 6, 2, 2, 15, 2, 10, 12, 4, 13, 1, 9, 16}, + []byte{15, 5}, + []byte{15, 5, 11, 6, 9, 3, 0, 8, 5, 11, 14, 11, 2, 1, 11, 0, 8, 7, 8, 12, 7, 14, 5, 15, 10, 11, 7, 5, 1, 9, 12, 14, 0, 13, 6, 1, 0, 5, 3, 5, 4, 12, 15, 6, 7, 4, 4, 13, 11, 15, 11, 7, 3, 14, 3, 7, 4, 5, 14, 9, 2, 9, 14, 4, 16}, + []byte{15, 6}, + []byte{15, 6, 7, 15, 4, 7, 0, 13, 15, 1, 5, 12, 8, 8, 11, 9, 11, 14, 10, 15, 3, 15, 10, 13, 7, 2, 8, 9, 0, 10, 6, 4, 15, 8, 8, 5, 1, 13, 0, 1, 14, 12, 14, 5, 4, 6, 11, 0, 12, 9, 15, 11, 3, 11, 13, 15, 9, 2, 0, 4, 1, 10, 3, 5, 16}, + []byte{15, 9}, + []byte{15, 9, 0}, + []byte{15, 9, 0, 8, 13, 7, 8, 5, 12, 14, 15, 1, 10, 11, 12, 9, 15, 12, 14, 10, 5, 5, 12, 0, 7, 4, 9, 0, 13, 1, 6, 11, 4, 8, 2, 5, 14, 8, 10, 6, 10, 7, 12, 8, 15, 11, 1, 5, 7, 14, 13, 2, 9, 0, 0, 11, 15, 4, 10, 15, 5, 8, 11, 9, 16}, + []byte{15, 9, 2}, + []byte{15, 9, 2, 15, 9, 9, 1, 1, 14, 6, 13, 5, 11, 4, 0, 14, 4, 6, 15, 5, 7, 4, 13, 11, 0, 10, 4, 0, 6, 13, 3, 6, 0, 15, 9, 1, 12, 8, 13, 14, 8, 4, 2, 13, 14, 13, 4, 8, 12, 8, 12, 6, 9, 9, 0, 8, 0, 9, 8, 5, 11, 4, 12, 15, 16}, + []byte{15, 9, 3}, + []byte{15, 9, 3, 13, 4, 4, 7, 15, 12, 15, 8, 6, 15, 8, 4, 7, 14, 6, 6, 0, 9, 11, 15, 11, 3, 1, 0, 0, 10, 10, 5, 13, 0, 7, 13, 15, 3, 7, 15, 2, 12, 7, 2, 12, 11, 12, 4, 9, 6, 1, 14, 3, 10, 0, 15, 8, 6, 10, 7, 12, 2, 4, 11, 7, 16}, + []byte{15, 11}, + []byte{15, 11, 1}, + []byte{15, 11, 1, 13, 6, 7, 9, 7, 7, 9, 6, 10, 13, 9, 14, 13, 13, 1, 11, 8, 11, 4, 1, 0, 3, 0, 0, 3, 5, 10, 0, 0, 3, 14, 11, 6, 2, 8, 6, 10, 14, 2, 15, 12, 1, 10, 8, 2, 9, 6, 11, 5, 0, 9, 8, 9, 1, 10, 12, 15, 10, 0, 3, 3, 16}, + []byte{15, 11, 6}, + []byte{15, 11, 6, 10, 11, 5, 1, 1, 12, 15, 5, 11, 12, 11, 1, 5, 7, 15, 8, 3, 3, 2, 4, 1, 14, 7, 4, 14, 10, 13, 7, 1, 2, 8, 10, 2, 1, 8, 1, 8, 12, 2, 11, 5, 0, 8, 0, 11, 14, 2, 1, 14, 14, 9, 15, 8, 5, 15, 15, 5, 13, 5, 2, 3, 16}, + []byte{15, 12}, + []byte{15, 12, 3}, + []byte{15, 12, 3, 9, 11, 11, 12, 15, 0, 8, 8, 1, 8, 14, 12, 3, 3, 2, 9, 14, 5, 7, 6, 9, 13, 15, 15, 3, 15, 11, 13, 10, 13, 6, 6, 14, 6, 3, 1, 2, 10, 9, 6, 1, 10, 12, 11, 3, 2, 12, 1, 11, 2, 0, 3, 14, 13, 15, 7, 0, 10, 14, 11, 10, 16}, + []byte{15, 12, 14}, + []byte{15, 12, 14, 7}, + []byte{15, 12, 14, 7, 3, 2, 1, 15, 2, 7, 8, 10, 2, 9, 7, 3, 11, 15, 5, 12, 6, 7, 7, 5, 7, 14, 10, 7, 6, 9, 0, 6, 4, 9, 2, 9, 5, 13, 5, 3, 9, 6, 7, 13, 10, 10, 3, 10, 14, 8, 5, 8, 6, 9, 5, 11, 14, 3, 3, 6, 10, 11, 14, 2, 16}, + []byte{15, 12, 14, 13}, + []byte{15, 12, 14, 13, 3, 4, 0, 8, 8, 5, 8, 2, 11, 4, 10, 7, 8, 15, 6, 1, 1, 12, 7, 3, 6, 6, 1, 9, 5, 14, 3, 14, 9, 4, 15, 9, 0, 8, 0, 6, 3, 7, 15, 4, 1, 0, 4, 11, 11, 11, 13, 0, 13, 0, 7, 15, 15, 11, 7, 8, 3, 13, 4, 9, 16}, + []byte{15, 13}, + []byte{15, 13, 15, 10, 12, 15, 5, 4, 8, 3, 15, 13, 13, 10, 2, 15, 12, 9, 8, 13, 0, 8, 11, 12, 12, 14, 1, 10, 6, 8, 13, 5, 13, 3, 0, 8, 13, 3, 10, 13, 8, 8, 14, 14, 2, 1, 11, 5, 0, 0, 0, 4, 15, 13, 6, 9, 4, 11, 10, 6, 15, 8, 0, 5, 16}, + []byte{15, 14}, + []byte{15, 14, 6, 10, 5, 8, 2, 0, 7, 7, 5, 0, 1, 9, 7, 15, 4, 8, 12, 11, 9, 0, 8, 6, 4, 0, 9, 6, 8, 5, 0, 2, 5, 9, 8, 4, 5, 12, 2, 12, 8, 14, 9, 0, 12, 7, 4, 4, 3, 3, 3, 2, 5, 12, 0, 11, 1, 4, 4, 11, 15, 8, 11, 11, 16}, + []byte{15, 15}, + []byte{15, 15, 15, 10, 0, 14, 10, 14, 2, 6, 8, 0, 3, 8, 12, 15, 10, 9, 8, 4, 6, 4, 7, 10, 1, 13, 0, 6, 3, 5, 11, 14, 11, 8, 6, 14, 13, 10, 9, 15, 11, 7, 11, 5, 0, 0, 6, 8, 8, 15, 3, 1, 8, 9, 5, 2, 0, 12, 15, 10, 9, 14, 14, 5, 16}, +} diff --git a/concurrent_iterator/iterator.go b/concurrent_iterator/iterator.go new file mode 100644 index 000000000..b5b752ae9 --- /dev/null +++ b/concurrent_iterator/iterator.go @@ -0,0 +1,164 @@ +// +// Copyright © 2020 Vulcanize, Inc +// +// 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 . + +package iterator + +import ( + "bytes" + "math/bits" + + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/trie" +) + +// PrefixBoundIterator is a NodeIterator constrained by a lower & upper bound (as hex path prefixes) +type PrefixBoundIterator struct { + trie.NodeIterator + StartPath []byte + EndPath []byte +} + +func (it *PrefixBoundIterator) Next(descend bool) bool { + if it.EndPath == nil { + return it.NodeIterator.Next(descend) + } + if !it.NodeIterator.Next(descend) { + return false + } + // stop if underlying iterator went past endKey + cmp := bytes.Compare(it.Path(), it.EndPath) + return cmp <= 0 +} + +// Iterator with an upper bound value (hex path prefix) +func NewPrefixBoundIterator(it trie.NodeIterator, from []byte, to []byte) *PrefixBoundIterator { + return &PrefixBoundIterator{NodeIterator: it, StartPath: from, EndPath: to} +} + +// generates nibble slice prefixes at uniform intervals +type prefixGenerator struct { + current []byte + step byte + stepIndex uint +} + +func newPrefixGenerator(nbins uint) prefixGenerator { + if bits.OnesCount(nbins) != 1 { + panic("nbins must be a power of 2") + } + // determine step dist. and path index at which to step + var step byte + var stepIndex uint + for ; nbins != 0; stepIndex++ { + divisor := byte(nbins & 0xF) + if divisor != 0 { + step = 0x10 / divisor + } + nbins = nbins >> 4 + } + return prefixGenerator{ + current: make([]byte, stepIndex), + step: step, + stepIndex: stepIndex - 1, + } +} + +func (gen *prefixGenerator) Value() []byte { + return gen.current +} + +func (gen *prefixGenerator) HasNext() bool { + return gen.current[0] < 0x10 +} + +func (gen *prefixGenerator) Next() { + // increment the cursor, and handle overflow + gen.current[gen.stepIndex] += gen.step + overflow := false + for ix := 0; ix < len(gen.current); ix++ { + rix := len(gen.current) - 1 - ix // index in prefix is reverse + if overflow { // apply overflow + gen.current[rix]++ + overflow = false + } + // detect overflow at this index + if rix != 0 && gen.current[rix] > 0xf { + gen.current[rix] = 0 + overflow = true + } + } +} + +// Generates paths that cut trie domain into `nbins` uniform conterminous bins (w/ opt. prefix) +// eg. MakePaths([], 2) => [[0] [8]] +// MakePaths([4], 32) => [[4 0 0] [4 0 8] [4 1 0]... [4 f 8]] +func MakePaths(prefix []byte, nbins uint) [][]byte { + var res [][]byte + for it := newPrefixGenerator(nbins); it.HasNext(); it.Next() { + next := make([]byte, len(prefix)) + copy(next, prefix) + next = append(next, it.Value()...) + res = append(res, next) + } + return res +} + +func eachPrefixRange(prefix []byte, nbins uint, callback func([]byte, []byte)) { + prefixes := MakePaths(prefix, nbins) + prefixes = append(prefixes, nil) // include tail + prefixes[0] = nil // set bin 0 left bound to nil to include root + for i := 0; i < len(prefixes)-1; i++ { + key := prefixes[i] + if len(key)%2 != 0 { // zero-pad for odd-length keys + key = append(key, 0) + } + callback(key, prefixes[i+1]) + } +} + +// Cut a trie by path prefix, returning `nbins` iterators covering its subtries +func SubtrieIterators(tree state.Trie, nbins uint) []trie.NodeIterator { + var iters []trie.NodeIterator + eachPrefixRange(nil, nbins, func(from []byte, to []byte) { + it := tree.NodeIterator(HexToKeyBytes(from)) + iters = append(iters, NewPrefixBoundIterator(it, from, to)) + }) + return iters +} + +// Factory for per-bin subtrie iterators +type SubtrieIteratorFactory struct { + tree state.Trie + startPaths, endPaths [][]byte +} + +func (fac *SubtrieIteratorFactory) Length() int { return len(fac.startPaths) } + +func (fac *SubtrieIteratorFactory) IteratorAt(bin uint) *PrefixBoundIterator { + it := fac.tree.NodeIterator(HexToKeyBytes(fac.startPaths[bin])) + return NewPrefixBoundIterator(it, fac.startPaths[bin], fac.endPaths[bin]) +} + +// Cut a trie by path prefix, returning `nbins` iterators covering its subtries +func NewSubtrieIteratorFactory(tree state.Trie, nbins uint) SubtrieIteratorFactory { + starts := make([][]byte, 0, nbins) + ends := make([][]byte, 0, nbins) + eachPrefixRange(nil, nbins, func(key []byte, endKey []byte) { + starts = append(starts, key) + ends = append(ends, endKey) + }) + return SubtrieIteratorFactory{tree: tree, startPaths: starts, endPaths: ends} +} diff --git a/concurrent_iterator/iterator_test.go b/concurrent_iterator/iterator_test.go new file mode 100644 index 000000000..50660ece8 --- /dev/null +++ b/concurrent_iterator/iterator_test.go @@ -0,0 +1,100 @@ +package iterator_test + +import ( + "bytes" + "fmt" + "testing" + + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + + iter "github.com/vulcanize/go-eth-state-node-iterator" + fixt "github.com/vulcanize/go-eth-state-node-iterator/fixture" +) + +func TestMakePaths(t *testing.T) { + var prefix []byte + for i := 0; i < 4; i++ { + nbins := uint(1) << i + paths := iter.MakePaths(prefix, nbins) + if len(paths) != int(nbins) { + t.Errorf("wrong number of paths; expected %d, have %d", nbins, len(paths)) + } + } +} + +func TestIterator(t *testing.T) { + edb, err := rawdb.NewLevelDBDatabaseWithFreezer( + fixt.ChainDataPath, 1024, 256, fixt.AncientDataPath, + "eth-pg-ipfs-state-snapshot", false, + ) + if err != nil { + t.Fatal(err) + } + defer edb.Close() + + height := uint64(1) + hash := rawdb.ReadCanonicalHash(edb, height) + header := rawdb.ReadHeader(edb, hash, height) + if header == nil { + t.Fatalf("unable to read canonical header at height %d", height) + } + sdb := state.NewDatabase(edb) + tree, err := sdb.OpenTrie(header.Root) + if err != nil { + t.Fatal(err) + } + + t.Run("in bounds", func(t *testing.T) { + type testCase struct { + lower, upper []byte + } + cases := []testCase{ + {nil, []byte{0, 0}}, + {[]byte{1, 0}, []byte{2, 0}}, + {[]byte{3, 5}, []byte{4, 2, 0}}, + {[]byte{5, 6, 9, 0}, []byte{7, 0}}, + {[]byte{8, 0}, []byte{8, 0}}, + {[]byte{8, 0}, []byte{7, 0}}, + } + + runCase := func(t *testing.T, tc testCase) { + it := iter.NewPrefixBoundIterator(tree.NodeIterator(iter.HexToKeyBytes(tc.lower)), tc.lower, tc.upper) + for it.Next(true) { + if bytes.Compare(it.Path(), tc.lower) < 0 { + t.Fatalf("iterator outside lower bound: %v", it.Path()) + } + if bytes.Compare(tc.upper, it.Path()) < 0 { + t.Fatalf("iterator outside upper bound: %v <= %v", tc.upper, it.Path()) + } + } + } + for _, tc := range cases { + t.Run("case", func(t *testing.T) { runCase(t, tc) }) + } + }) + + t.Run("trie is covered", func(t *testing.T) { + allPaths := fixt.Block1_Paths + cases := []uint{1, 2, 4, 8, 16, 32} + runCase := func(t *testing.T, nbins uint) { + iters := iter.SubtrieIterators(tree, nbins) + ix := 0 + for b := uint(0); b < nbins; b++ { + for it := iters[b]; it.Next(true); ix++ { + if !bytes.Equal(allPaths[ix], it.Path()) { + t.Fatalf("wrong path value\nexpected:\t%v\nactual:\t\t%v", + allPaths[ix], it.Path()) + } + } + // if the last node path was even-length, it will be duplicated + if len(allPaths[ix-1])&0b1 == 0 { + ix-- + } + } + } + for _, tc := range cases { + t.Run(fmt.Sprintf("%d bins", tc), func(t *testing.T) { runCase(t, tc) }) + } + }) +} diff --git a/concurrent_iterator/tracker/tracker.go b/concurrent_iterator/tracker/tracker.go new file mode 100644 index 000000000..d3ea7b9e9 --- /dev/null +++ b/concurrent_iterator/tracker/tracker.go @@ -0,0 +1,243 @@ +package tracker + +import ( + "bytes" + "context" + "encoding/csv" + "fmt" + "os" + "os/signal" + "syscall" + + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/trie" + log "github.com/sirupsen/logrus" + + iter "github.com/vulcanize/go-eth-state-node-iterator" +) + +type Tracker struct { + recoveryFile string + + startChan chan *Iterator + stopChan chan *Iterator + started map[*Iterator]struct{} + stopped []*Iterator + running bool +} + +type Iterator struct { + trie.NodeIterator + tracker *Tracker + + SeekedPath []byte // latest path seeked from the tracked iterator + EndPath []byte // endPath for the tracked iterator +} + +func New(file string, buf uint) Tracker { + return Tracker{ + recoveryFile: file, + startChan: make(chan *Iterator, buf), + stopChan: make(chan *Iterator, buf), + started: map[*Iterator]struct{}{}, + running: true, + } +} + +func (tr *Tracker) CaptureSignal(cancelCtx context.CancelFunc) { + sigChan := make(chan os.Signal, 1) + + signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) + go func() { + sig := <-sigChan + log.Errorf("Signal received (%v), stopping", sig) + // cancel context on receiving a signal + // on ctx cancellation, all the iterators complete processing of their current node before stopping + cancelCtx() + }() +} + +// Wraps an iterator in a Iterator. This should not be called once halts are possible. +func (tr *Tracker) Tracked(it trie.NodeIterator, recoveredPath []byte) (ret *Iterator) { + // create seeked path of max capacity (65) + iterSeekedPath := make([]byte, 0, 65) + // intially populate seeked path with the recovered path + // to be used in trie traversal + if recoveredPath != nil { + iterSeekedPath = append(iterSeekedPath, recoveredPath...) + } + + // if the iterator being tracked is a PrefixBoundIterator, capture it's end path + // to be used in trie traversal + var endPath []byte + if boundedIter, ok := it.(*iter.PrefixBoundIterator); ok { + endPath = boundedIter.EndPath + } + + ret = &Iterator{it, tr, iterSeekedPath, endPath} + tr.startChan <- ret + return +} + +// explicitly stops an iterator +func (tr *Tracker) StopIterator(it *Iterator) { + tr.stopChan <- it +} + +// dumps iterator path and bounds to a text file so it can be restored later +func (tr *Tracker) dump() error { + log.Debugf("Dumping recovery state to: %s", tr.recoveryFile) + var rows [][]string + for it := range tr.started { + var startPath []byte + var endPath []byte + if impl, ok := it.NodeIterator.(*iter.PrefixBoundIterator); ok { + // if the iterator being tracked is a PrefixBoundIterator, + // initialize start and end paths with its bounds + startPath = impl.StartPath + endPath = impl.EndPath + } + + // if seeked path and iterator path are non-empty, use iterator's path as startpath + if !bytes.Equal(it.SeekedPath, []byte{}) && !bytes.Equal(it.Path(), []byte{}) { + startPath = it.Path() + } + + rows = append(rows, []string{ + fmt.Sprintf("%x", startPath), + fmt.Sprintf("%x", endPath), + fmt.Sprintf("%x", it.SeekedPath), + }) + } + + file, err := os.Create(tr.recoveryFile) + if err != nil { + return err + } + defer file.Close() + out := csv.NewWriter(file) + + return out.WriteAll(rows) +} + +// attempts to read iterator state from file +// if file doesn't exist, returns an empty slice with no error +func (tr *Tracker) Restore(tree state.Trie) ([]trie.NodeIterator, error) { + file, err := os.Open(tr.recoveryFile) + if err != nil { + if os.IsNotExist(err) { + return nil, nil + } + return nil, err + } + log.Debugf("Restoring recovery state from: %s", tr.recoveryFile) + + defer file.Close() + in := csv.NewReader(file) + in.FieldsPerRecord = 3 + rows, err := in.ReadAll() + if err != nil { + return nil, err + } + + var ret []trie.NodeIterator + for _, row := range rows { + // pick up where each interval left off + var startPath []byte + var endPath []byte + var recoveredPath []byte + + if len(row[0]) != 0 { + if _, err = fmt.Sscanf(row[0], "%x", &startPath); err != nil { + return nil, err + } + } + if len(row[1]) != 0 { + if _, err = fmt.Sscanf(row[1], "%x", &endPath); err != nil { + return nil, err + } + } + if len(row[2]) != 0 { + if _, err = fmt.Sscanf(row[2], "%x", &recoveredPath); err != nil { + return nil, err + } + } + + // force the lower bound path to an even length (required by geth API/HexToKeyBytes) + if len(startPath)&0b1 == 1 { + // decrement first to avoid skipped nodes + decrementPath(startPath) + startPath = append(startPath, 0) + } + it := iter.NewPrefixBoundIterator(tree.NodeIterator(iter.HexToKeyBytes(startPath)), startPath, endPath) + ret = append(ret, tr.Tracked(it, recoveredPath)) + } + + log.Debugf("Restored %d iterators", len(ret)) + return ret, nil +} + +func (tr *Tracker) HaltAndDump() error { + tr.running = false + + // drain any pending iterators + close(tr.startChan) + for start := range tr.startChan { + tr.started[start] = struct{}{} + } + close(tr.stopChan) + for stop := range tr.stopChan { + tr.stopped = append(tr.stopped, stop) + } + + for _, stop := range tr.stopped { + delete(tr.started, stop) + } + + if len(tr.started) == 0 { + // if the tracker state is empty, erase any existing recovery file + err := os.Remove(tr.recoveryFile) + if os.IsNotExist(err) { + err = nil + } + return err + } + + return tr.dump() +} + +func (it *Iterator) Next(descend bool) bool { + ret := it.NodeIterator.Next(descend) + + if !ret { + if it.tracker.running { + it.tracker.stopChan <- it + } else { + log.Errorf("iterator stopped after tracker halted: path=%x", it.Path()) + } + } + return ret +} + +// Subtracts 1 from the last byte in a path slice, carrying if needed. +// Does nothing, returning false, for all-zero inputs. +func decrementPath(path []byte) bool { + // check for all zeros + allzero := true + for i := 0; i < len(path); i++ { + allzero = allzero && path[i] == 0 + } + if allzero { + return false + } + for i := len(path) - 1; i >= 0; i-- { + val := path[i] + path[i]-- + if val == 0 { + path[i] = 0xf + } else { + return true + } + } + return true +} diff --git a/concurrent_iterator/util.go b/concurrent_iterator/util.go new file mode 100644 index 000000000..5dd6601a0 --- /dev/null +++ b/concurrent_iterator/util.go @@ -0,0 +1,49 @@ +package iterator + +import ( + "bytes" + "github.com/ethereum/go-ethereum/trie" +) + +func CompareNodes(a, b trie.NodeIterator) int { + if cmp := bytes.Compare(a.Path(), b.Path()); cmp != 0 { + return cmp + } + if a.Leaf() && !b.Leaf() { + return -1 + } else if b.Leaf() && !a.Leaf() { + return 1 + } + if cmp := bytes.Compare(a.Hash().Bytes(), b.Hash().Bytes()); cmp != 0 { + return cmp + } + if a.Leaf() && b.Leaf() { + return bytes.Compare(a.LeafBlob(), b.LeafBlob()) + } + return 0 +} + +// hexToKeyBytes turns hex nibbles into key bytes. +// This can only be used for keys of even length. +func HexToKeyBytes(hex []byte) []byte { + if hasTerm(hex) { + hex = hex[:len(hex)-1] + } + if len(hex)&1 != 0 { + panic("can't convert hex key of odd length") + } + key := make([]byte, len(hex)/2) + decodeNibbles(hex, key) + return key +} + +func decodeNibbles(nibbles []byte, bytes []byte) { + for bi, ni := 0, 0; ni < len(nibbles); bi, ni = bi+1, ni+2 { + bytes[bi] = nibbles[ni]<<4 | nibbles[ni+1] + } +} + +// hasTerm returns whether a hex key has the terminator flag. +func hasTerm(s []byte) bool { + return len(s) > 0 && s[len(s)-1] == 16 +}