From c1fd2dbd974936c9ffc8d6977050d0f243308dd7 Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Fri, 2 Oct 2026 14:59:18 +0100 Subject: [PATCH 1/7] ALDEx2 native + P3/P6 property tests with mutants; RCall reference extension; oracle harness (WIP: oracle not yet run) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_019Y6e175rh1LbrsEhQvCrJ1 --- .github/workflows/ci.yml | 33 ++++++++++ .gitignore | 1 + Project.toml | 21 ++++-- docs/R-SUNSET.md | 7 +- ext/CompositionalDARCallExt.jl | 58 +++++++++++++++++ src/CompositionalDA.jl | 5 ++ src/Methods/ALDEx2.jl | 115 ++++++++++++++++++++++----------- test/mutants.jl | 18 ++++++ test/oracle/Project.toml | 8 +++ test/oracle/datasets.jl | 32 +++++++++ test/oracle/runoracle.jl | 54 ++++++++++++++++ test/properties.jl | 30 +++++++++ test/property_aldex2.jl | 43 ++++++++++++ test/runtests.jl | 1 + 14 files changed, 379 insertions(+), 47 deletions(-) create mode 100644 ext/CompositionalDARCallExt.jl create mode 100644 test/oracle/Project.toml create mode 100644 test/oracle/datasets.jl create mode 100644 test/oracle/runoracle.jl create mode 100644 test/property_aldex2.jl diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2892150..7698340 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -49,3 +49,36 @@ jobs: run: proofs/bootstrap.sh - name: Gate self-test (the gate must reject planted defects) run: proofs/tests/gate-selftest.sh + oracle: + name: R reference oracle (R 4.5.0, Bioconductor 3.22) + runs-on: ubuntu-24.04 + timeout-minutes: 60 + env: + R_LIBS_USER: ${{ github.workspace }}/.r-lib + steps: + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + - uses: r-lib/actions/setup-r@f9a764fea8d5c63df6ef9a5c7795bf7deb5d7e05 # v2 + with: + r-version: '4.5.0' + use-public-rspm: true + - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + with: + path: .r-lib + key: r-4.5.0-bioc-3.22-oracle-v1 + - name: Install the Bioconductor 3.22 references + run: | + mkdir -p "$R_LIBS_USER" + Rscript -e 'options(Ncpus = 4, timeout = 3600) + if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager") + BiocManager::install(version = "3.22", ask = FALSE, update = FALSE) + for (p in c("ALDEx2")) if (!requireNamespace(p, quietly = TRUE)) BiocManager::install(p, ask = FALSE, update = FALSE) + for (p in c("ALDEx2")) cat(p, as.character(packageVersion(p)), "\n")' + - uses: julia-actions/setup-julia@4c0cb0fce8556fdb04a90347310e5db8b1f98fb9 # v2 + with: + version: '1.12' + - uses: julia-actions/cache@d10a6fd8f31b12404a54613ebad242900567f2b9 # v2 + - name: Native vs reference agreement + run: | + export R_HOME="$(R RHOME)" + julia --project=test/oracle -e 'using Pkg; Pkg.develop(path="."); Pkg.instantiate()' + julia --project=test/oracle test/oracle/runoracle.jl diff --git a/.gitignore b/.gitignore index 6b69765..e79ce1d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ proofs/.vendor/ proofs/.agda-libraries *.agdai _build/ +/test/oracle/Manifest.toml diff --git a/Project.toml b/Project.toml index fae0803..bfb260a 100644 --- a/Project.toml +++ b/Project.toml @@ -1,28 +1,39 @@ name = "CompositionalDA" uuid = "a77efed1-127c-5b9d-bf19-e0eccfa50304" -authors = ["Jonathan D.A. Jewell "] version = "0.1.0" +authors = ["Jonathan D.A. Jewell "] [deps] DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" +HypothesisTests = "09f84164-cd44-5f33-b23f-e6b0d136a0d5" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +[weakdeps] +RCall = "6f49c342-dc21-5d91-9882-a32aef131414" + +[extensions] +CompositionalDARCallExt = "RCall" + [compat] Aqua = "0.8" -StableRNGs = "1" -Test = "1" DataFrames = "1.6" +Distributions = "0.25" +HypothesisTests = "0.11, 0.12" LinearAlgebra = "1" Random = "1" +RCall = "0.14" +StableRNGs = "1" Statistics = "1" +Test = "1" julia = "1.10" [extras] Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" -StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [targets] -test = ["Aqua", "StableRNGs", "Test"] +test = ["Aqua", "Test"] diff --git a/docs/R-SUNSET.md b/docs/R-SUNSET.md index 99e308c..d074c3f 100644 --- a/docs/R-SUNSET.md +++ b/docs/R-SUNSET.md @@ -7,11 +7,12 @@ > there is no `ext/` directory and no `test/oracle_*.jl` yet. The R backend (`ext/CompositionalDARCallExt.jl`, loaded only when RCall is -present) is a bridge, not a product. It never owns R state. Callers pass an -`evaluator` function, so a host application keeps its own R session and lock. +present) is a bridge, not a product. It never owns R state. Every R call runs inside a +caller-supplied `runner` function, so a host application keeps its own R session +and lock (MetaManifold passes its `with_r_lock`). **Criterion.** For each method, once the native implementation agrees with the R -reference within the tolerances stated in `test/oracle_*.jl` on all three +reference within the tolerances stated in `test/oracle/runoracle.jl` on all three reference datasets (mock, gut, soil) for **two consecutive releases**, that method's R path is marked deprecated in the next release and receives no further maintenance. When no method still needs it, the extension is deleted. diff --git a/ext/CompositionalDARCallExt.jl b/ext/CompositionalDARCallExt.jl new file mode 100644 index 0000000..92852a1 --- /dev/null +++ b/ext/CompositionalDARCallExt.jl @@ -0,0 +1,58 @@ +# SPDX-License-Identifier: MPL-2.0 +# SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# The R reference backend. It is a transition aid and a test oracle; see +# docs/R-SUNSET.md for when it stops being maintained. Nothing here holds R +# state: every R call runs inside the caller's `runner`, so a host application +# that serialises its single R session (e.g. MetaManifold's `with_r_lock`) +# passes that function in. + +module CompositionalDARCallExt + +using CompositionalDA +using CompositionalDA: Provenance, DAResult, validate_counts, CompositionError +using DataFrames +using RCall + +""" + aldex2_reference(counts, features, groups; mc_samples = 128, seed = 1, runner = f -> f()) + +Run Bioconductor ALDEx2 (`aldex(..., test = "t", effect = TRUE, denom = "all")`) +on the same input as [`CompositionalDA.aldex2`](@ref) and return a `DAResult` with +the same column names. Requires R with the ALDEx2 package installed. +""" +function CompositionalDA.aldex2_reference(counts::AbstractMatrix{<:Integer}, features::AbstractVector, + groups::AbstractVector; mc_samples::Integer = 128, + seed::Integer = 1, runner = f -> f()) + validate_counts(counts) + size(counts, 2) == length(features) || throw(CompositionError("feature names do not match columns")) + levels = sort(unique(string.(groups))) + length(levels) == 2 || throw(CompositionError("aldex2 needs exactly 2 groups")) + df = runner() do + reads = permutedims(Matrix{Int}(counts)) # ALDEx2 wants features × samples + @rput reads + conds = string.(groups); lv = levels + @rput conds lv + fnames = string.(features); @rput fnames + R""" + set.seed($seed) + reads <- as.data.frame(reads); rownames(reads) <- fnames + colnames(reads) <- paste0("s", seq_len(ncol(reads))) + res <- ALDEx2::aldex(reads, factor(conds, levels = lv), mc.samples = $mc_samples, + test = "t", effect = TRUE, denom = "all", verbose = FALSE) + res <- res[fnames, ] + res$feature <- rownames(res) + aldex_version <- as.character(packageVersion("ALDEx2")) + """ + rcopy(DataFrame, R"res"), rcopy(String, R"aldex_version") + end + res, ver = df + table = DataFrame(feature = res[!, "feature"], effect = res[!, "effect"], pvalue = res[!, "we.ep"], + qvalue = res[!, "we.eBH"], wi_pvalue = res[!, "wi.ep"], wi_qvalue = res[!, "wi.eBH"], + diff_btw = res[!, "diff.btw"], diff_win = res[!, "diff.win"], rab_all = res[!, "rab.all"]) + prov = Provenance(:aldex2, :r_reference; seed, mc_samples, r_package = "ALDEx2 $ver", + contrast = "$(levels[2]) vs $(levels[1])") + return DAResult(table, prov) +end + +end # module diff --git a/src/CompositionalDA.jl b/src/CompositionalDA.jl index 42a6855..d22ac3f 100644 --- a/src/CompositionalDA.jl +++ b/src/CompositionalDA.jl @@ -16,8 +16,11 @@ proved in `proofs/agda` and mirrored by property tests in `test/`. See module CompositionalDA using DataFrames +using Distributions: Gamma +using HypothesisTests: UnequalVarianceTTest, ExactMannWhitneyUTest, ApproximateMannWhitneyUTest, pvalue using LinearAlgebra using Random +using StableRNGs: StableRNG using Statistics include("Core/errors.jl") @@ -25,11 +28,13 @@ include("Core/zeros.jl") include("Core/composition.jl") include("Core/bh.jl") include("Core/result.jl") +include("Methods/ALDEx2.jl") export CompositionError export ZeroPolicy, RefuseZeros, Pseudocount, MultiplicativeReplacement, replace_zeros export validate_counts, closure, clr export bh_adjust export Provenance, DAResult +export aldex2, aldex2_reference, dirichlet_clr_instances end # module diff --git a/src/Methods/ALDEx2.jl b/src/Methods/ALDEx2.jl index 85d8fcc..12d69a4 100644 --- a/src/Methods/ALDEx2.jl +++ b/src/Methods/ALDEx2.jl @@ -55,35 +55,81 @@ function wilcoxon_p(a, b) end """ - aldex2_effect(rng, x1, x2) -> (effect, diff_btw, diff_win) + effect_pairs(rng, n1, n2, m) -> NamedTuple + +Random index vectors for the ALDEx2 effect size: `m` draws of a group-1 element, +a group-2 element, and a second element of each group for the within-group +spread. They are drawn once and shared by every feature, so relabelling the +features permutes the effect sizes exactly (P6). +""" +effect_pairs(rng::AbstractRNG, n1::Integer, n2::Integer, m::Integer) = + (a = rand(rng, 1:n1, m), b = rand(rng, 1:n2, m), + a2 = rand(rng, 1:n1, m), b2 = rand(rng, 1:n2, m)) + +""" + aldex2_effect(pairs, x1, x2) -> (effect, diff_btw, diff_win) ALDEx2 effect size for one feature. `x1` and `x2` are the instance-pooled CLR -values of the two groups. The between-group difference is taken over random -cross-group pairs. The within-group dispersion is the larger of the two groups' -absolute differences over random within-group pairs. The effect is the median of -their ratio; `diff_btw` and `diff_win` are the medians of each part. -""" -function aldex2_effect(rng::AbstractRNG, x1::AbstractVector, x2::AbstractVector) - m = max(length(x1), length(x2)) - a = x1[rand(rng, 1:length(x1), m)] - b = x2[rand(rng, 1:length(x2), m)] +values of the two groups and `pairs` comes from [`effect_pairs`](@ref). The +between-group difference is taken over random cross-group pairs. The +within-group dispersion is the larger of the two groups' absolute differences +over random within-group pairs. The effect is the median of their ratio; +`diff_btw` and `diff_win` are the medians of each part. +""" +function aldex2_effect(pairs, x1::AbstractVector, x2::AbstractVector) + a = x1[pairs.a]; b = x2[pairs.b] btw = b .- a - w1 = abs.(a .- x1[rand(rng, 1:length(x1), m)]) - w2 = abs.(b .- x2[rand(rng, 1:length(x2), m)]) - win = max.(w1, w2) + win = max.(abs.(a .- x1[pairs.a2]), abs.(b .- x2[pairs.b2])) ratio = btw ./ max.(win, eps()) return median(ratio), median(btw), median(win) end +""" + aldex2_from_instances(inst, i1, i2; rng) -> DataFrame + +The deterministic part of ALDEx2, applied to Monte-Carlo CLR instances +`inst[sample, feature, instance]` with group-1 rows `i1` and group-2 rows `i2`. +For every instance it runs a Welch t-test and a Wilcoxon test per feature and +BH-adjusts across features. The reported values are the means over instances. +`rng` is used only for the effect-size pairing indices. The columns are not +named here; [`aldex2`](@ref) adds the feature names. +""" +function aldex2_from_instances(inst::AbstractArray{<:Real,3}, i1::AbstractVector{<:Integer}, + i2::AbstractVector{<:Integer}; rng::AbstractRNG) + _, d, mc = size(inst) + we_p = zeros(d); we_q = zeros(d); wi_p = zeros(d); wi_q = zeros(d) + pw = Vector{Float64}(undef, d); pr = Vector{Float64}(undef, d) + for k in 1:mc + for j in 1:d + a = inst[i1, j, k]; b = inst[i2, j, k] + pw[j] = welch_p(a, b) + pr[j] = wilcoxon_p(a, b) + end + we_p .+= pw; we_q .+= bh_adjust(pw) + wi_p .+= pr; wi_q .+= bh_adjust(pr) + end + we_p ./= mc; we_q ./= mc; wi_p ./= mc; wi_q ./= mc + + n1 = length(i1) * mc; n2 = length(i2) * mc + pairs = effect_pairs(rng, n1, n2, max(n1, n2)) + eff = zeros(d); btw = zeros(d); win = zeros(d); rab = zeros(d) + for j in 1:d + x1 = vec(inst[i1, j, :]); x2 = vec(inst[i2, j, :]) + eff[j], btw[j], win[j] = aldex2_effect(pairs, x1, x2) + rab[j] = median(vec(inst[:, j, :])) + end + return DataFrame(effect = eff, pvalue = we_p, qvalue = we_q, wi_pvalue = wi_p, + wi_qvalue = wi_q, diff_btw = btw, diff_win = win, rab_all = rab) +end + """ aldex2(counts, features, groups; mc_samples = 128, seed = 1) -> DAResult Two-group ALDEx2 on raw counts (samples × features). `groups` gives each sample's condition and must have exactly two levels; the second level in sorted -order is compared against the first. For every Monte-Carlo CLR instance it runs -a Welch t-test and a Wilcoxon test per feature and BH-adjusts across features. -The reported values are the means over instances: `pvalue`/`qvalue` (Welch) and -`wi_pvalue`/`wi_qvalue` (Wilcoxon). `effect` is the ALDEx2 effect size. +order is compared against the first. The result has the columns `feature`, +`effect`, `pvalue`/`qvalue` (expected Welch p and expected BH), +`wi_pvalue`/`wi_qvalue` (Wilcoxon), `diff_btw`, `diff_win` and `rab_all`. Deterministic for a fixed `seed` (StableRNG). Calibration is tested against the Bioconductor reference, not proved. @@ -102,29 +148,20 @@ function aldex2(counts::AbstractMatrix{<:Integer}, features::AbstractVector, rng = StableRNG(seed) inst = dirichlet_clr_instances(rng, counts; mc_samples) - we_p = zeros(d); we_q = zeros(d); wi_p = zeros(d); wi_q = zeros(d) - pw = Vector{Float64}(undef, d); pr = Vector{Float64}(undef, d) - for k in 1:mc_samples - for j in 1:d - a = inst[i1, j, k]; b = inst[i2, j, k] - pw[j] = welch_p(a, b) - pr[j] = wilcoxon_p(a, b) - end - we_p .+= pw; we_q .+= bh_adjust(pw) - wi_p .+= pr; wi_q .+= bh_adjust(pr) - end - we_p ./= mc_samples; we_q ./= mc_samples; wi_p ./= mc_samples; wi_q ./= mc_samples - - eff = zeros(d); btw = zeros(d); win = zeros(d); rab = zeros(d) - for j in 1:d - x1 = vec(inst[i1, j, :]); x2 = vec(inst[i2, j, :]) - eff[j], btw[j], win[j] = aldex2_effect(rng, x1, x2) - rab[j] = median(vec(inst[:, j, :])) - end - table = DataFrame(feature = collect(features), effect = eff, pvalue = we_p, qvalue = we_q, - wi_pvalue = wi_p, wi_qvalue = wi_q, diff_btw = btw, diff_win = win, - rab_all = rab) + table = aldex2_from_instances(inst, i1, i2; rng) + insertcols!(table, 1, :feature => collect(features)) prov = Provenance(:aldex2, :native; seed, mc_samples, test = "welch+wilcoxon", contrast = "$(levels[2]) vs $(levels[1])", prior = 0.5) return DAResult(table, prov) end + +""" + aldex2_reference(counts, features, groups; mc_samples = 128, seed = 1, runner = f -> f()) + +The Bioconductor ALDEx2 reference, with the same input and output shape as +[`aldex2`](@ref). It is defined by the RCall package extension and is available +only after `using RCall` with ALDEx2 installed in R. `runner` wraps every R call, +so a host can serialise access to its R session. It is a test oracle and +transition aid; see `docs/R-SUNSET.md`. +""" +function aldex2_reference end diff --git a/test/mutants.jl b/test/mutants.jl index be9ed0f..f07d9ad 100644 --- a/test/mutants.jl +++ b/test/mutants.jl @@ -20,3 +20,21 @@ function mutant_bh_no_cummin(p) for (r, k) in enumerate(ord); q[k] = min(1.0, p[idx][k] * m / r); end out[idx] = q; out end + +"""Mutant: instances are log-proportions without centring. Breaks P3.""" +function mutant_instances_uncentred(rng, counts) + inst = CompositionalDA.dirichlet_clr_instances(rng, counts; mc_samples = 8) + inst .+ reshape(1:size(inst, 1), :, 1, 1) +end + +"""Mutant: draws fresh effect-size pairings per feature, so the effect depends +on feature position. Breaks P6.""" +function mutant_aldex2_per_feature_pairs(inst, i1, i2; rng) + t = CompositionalDA.aldex2_from_instances(inst, i1, i2; rng) + n1 = length(i1) * size(inst, 3); n2 = length(i2) * size(inst, 3) + for j in 1:size(inst, 2) + p = CompositionalDA.effect_pairs(rng, n1, n2, max(n1, n2)) + t.effect[j] = CompositionalDA.aldex2_effect(p, vec(inst[i1, j, :]), vec(inst[i2, j, :]))[1] + end + t +end diff --git a/test/oracle/Project.toml b/test/oracle/Project.toml new file mode 100644 index 0000000..30dec19 --- /dev/null +++ b/test/oracle/Project.toml @@ -0,0 +1,8 @@ +[deps] +CompositionalDA = "a77efed1-127c-5b9d-bf19-e0eccfa50304" +DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" +RCall = "6f49c342-dc21-5d91-9882-a32aef131414" +StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3" +Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" diff --git a/test/oracle/datasets.jl b/test/oracle/datasets.jl new file mode 100644 index 0000000..e7ddb23 --- /dev/null +++ b/test/oracle/datasets.jl @@ -0,0 +1,32 @@ +# SPDX-License-Identifier: MPL-2.0 +# SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# Oracle datasets. `mock` is synthetic with a known answer. The public gut and +# soil tables are fetched by checksum at run time and their sources and licences +# are recorded in docs/DATASETS.md. + +using Distributions: Multinomial, LogNormal +using StableRNGs + +""" + mock_dataset(; seed = 2026) -> (counts, features, groups, truth) + +A two-group synthetic count table with planted differential features: 10 +samples per group, 40 features with log-normal base abundances, features 1–3 +up 8×, 4–5 down 4× in group "b", and multinomial sampling at depths 5k–20k. +`truth` lists the planted features. It is not a MetaManifold fixture (that +repository has no count-table fixtures). +""" +function mock_dataset(; seed::Integer = 2026) + r = StableRNG(seed) + d = 40; n = 10 + base = rand(r, LogNormal(0, 1.5), d) + fold = ones(d); fold[1:3] .= 8; fold[4:5] .= 0.25 + rows = Vector{Vector{Int}}() + for g in 1:2, _ in 1:n + w = base .* (g == 2 ? fold : ones(d)) .* rand(r, LogNormal(0, 0.3), d) + push!(rows, rand(r, Multinomial(rand(r, 5_000:20_000), w ./ sum(w)))) + end + counts = permutedims(reduce(hcat, rows)) + return counts, ["mock$j" for j in 1:d], vcat(fill("a", n), fill("b", n)), ["mock$j" for j in 1:5] +end diff --git a/test/oracle/runoracle.jl b/test/oracle/runoracle.jl new file mode 100644 index 0000000..a940556 --- /dev/null +++ b/test/oracle/runoracle.jl @@ -0,0 +1,54 @@ +# SPDX-License-Identifier: MPL-2.0 +# SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# Agreement between the native methods and the Bioconductor references. +# Run: julia --project=test/oracle test/oracle/runoracle.jl +# +# Tolerance rule: both implementations are Monte-Carlo, so exact agreement is +# not expected. The yardstick is R against itself under a different seed. The +# native result must sit no further from R than SLACK × that seed-to-seed +# distance, plus a small absolute floor. + +using CompositionalDA, DataFrames, RCall, Statistics, Test + +include("datasets.jl") + +const MC = 512 +const SLACK = 2.0 +const FLOOR = (effect = 0.05, pvalue = 0.01) + +"""Largest absolute difference of column `c` between two result tables.""" +maxdiff(a, b, c) = maximum(abs.(a.table[!, c] .- b.table[!, c])) + +""" + agree(native, r1, r2) -> NamedTuple + +Native-vs-R and R-vs-R(other seed) distances for effect and expected Welch p, +and whether native is within tolerance of R for each. +""" +function agree(native, r1, r2) + out = map((:effect, :pvalue)) do c + dn = maxdiff(native, r1, c); dr = maxdiff(r2, r1, c) + c => (native = dn, r_vs_r = dr, ok = dn <= SLACK * dr + FLOOR[c]) + end + NamedTuple(out) +end + +@testset "ALDEx2 oracle" begin + datasets = Any[("mock", mock_dataset())] + for (name, (x, f, g, truth)) in datasets + nat = aldex2(x, f, g; mc_samples = MC, seed = 1) + r1 = aldex2_reference(x, f, g; mc_samples = MC, seed = 1) + r2 = aldex2_reference(x, f, g; mc_samples = MC, seed = 2) + a = agree(nat, r1, r2) + println(name, ": ", a, " R=", r1.provenance.parameters) + @test a.effect.ok + @test a.pvalue.ok + @test cor(nat.table.effect, r1.table.effect) > 0.99 + if !isempty(truth) + hit(t) = Set(t.table.feature[t.table.qvalue .< 0.05]) + println(name, ": native calls ", sort(collect(hit(nat))), "; R calls ", sort(collect(hit(r1)))) + @test hit(nat) == hit(r1) + end + end +end diff --git a/test/properties.jl b/test/properties.jl index 9d47ef1..c856f0d 100644 --- a/test/properties.jl +++ b/test/properties.jl @@ -47,3 +47,33 @@ prop_bh_monotone(f; seed = 5) = all(pvectors(seed)) do p all(q[ok] .>= p[ok] .- 1e-15) && all(q[ok] .<= 1) && all(q[i] <= q[j] + 1e-15 for i in ok, j in ok if p[i] <= p[j]) end + +"""Random count matrices (samples × features) with two groups of ≥ 3 samples.""" +function count_tables(seed; n = 8) + map(1:n) do k + r = StableRNG(seed + k) + s = rand(r, 6:10); d = rand(r, 3:12) + x = rand(r, 0:200, s, d); x[:, 1] .+= 1 + g = vcat(fill("a", s ÷ 2), fill("b", s - s ÷ 2)) + (x, g) + end +end + +"""P3: every Monte-Carlo instance from generator `f(rng, counts)` is a CLR: +each instance row sums to zero, and is unchanged when a sample's counts are +replicated across a constant column offset in log space (closure cancels).""" +prop_instances_are_clr(f; seed = 7) = all(count_tables(seed)) do (x, _) + inst = f(StableRNG(seed), x) + all(abs.(sum(inst; dims = 2)) .< 1e-9) +end + +"""P6: given fixed instances, relabelling the features permutes every output +column of estimator `f(inst, i1, i2; rng)` identically.""" +prop_aldex2_equivariant(f; seed = 8) = all(count_tables(seed)) do (x, g) + inst = CompositionalDA.dirichlet_clr_instances(StableRNG(seed), x; mc_samples = 16) + i1 = findall(==("a"), g); i2 = findall(==("b"), g) + σ = randperm(StableRNG(seed + size(x, 2)), size(x, 2)) + t = f(inst, i1, i2; rng = StableRNG(seed)) + tσ = f(inst[:, σ, :], i1, i2; rng = StableRNG(seed)) + all(isapprox(Matrix(tσ), Matrix(t)[σ, :]; atol = 1e-12)) +end diff --git a/test/property_aldex2.jl b/test/property_aldex2.jl new file mode 100644 index 0000000..21f4d83 --- /dev/null +++ b/test/property_aldex2.jl @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: MPL-2.0 +# SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) + +using StableRNGs + +@testset "ALDEx2" begin + @testset "P3 every Monte-Carlo instance is a CLR" begin + gen(rng, x) = dirichlet_clr_instances(rng, x; mc_samples = 8) + @test prop_instances_are_clr(gen) + @test !prop_instances_are_clr(mutant_instances_uncentred) + end + @testset "P6 equivariant under feature relabelling (given instances)" begin + @test prop_aldex2_equivariant(CompositionalDA.aldex2_from_instances) + @test !prop_aldex2_equivariant(mutant_aldex2_per_feature_pairs) + end + @testset "deterministic for a fixed seed" begin + x, g = count_tables(11)[1] + f = ["f$j" for j in 1:size(x, 2)] + @test aldex2(x, f, g; mc_samples = 16, seed = 3).table == + aldex2(x, f, g; mc_samples = 16, seed = 3).table + end + @testset "planted signal is found; null features are not" begin + r = StableRNG(21) + base = [400, 300, 200, 100, 80, 60, 40, 30, 20, 10] + rows = [rand(r, 0.8:0.01:1.2, 10) .* base for _ in 1:16] + for i in 9:16; rows[i][1] *= 8; end # feature 1 up 8× in group b + x = round.(Int, permutedims(reduce(hcat, rows)) .* 5) + g = vcat(fill("a", 8), fill("b", 8)) + t = aldex2(x, ["f$j" for j in 1:10], g; mc_samples = 64).table + @test t.qvalue[1] < 0.05 + @test t.effect[1] > 1 + # The other features shift only through the closure (by the CLR of the + # change), so their effects must be small and negative, not significant. + @test all(abs.(t.effect[2:end]) .< abs(t.effect[1])) + end + @testset "input validation" begin + x = [1 2; 3 4; 5 6; 7 8] + @test_throws CompositionError aldex2(x, ["a"], ["u", "u", "v", "v"]) + @test_throws CompositionError aldex2(x, ["a", "b"], ["u", "u", "u", "u"]) + @test_throws CompositionError aldex2(x, ["a", "b"], ["u", "v", "v", "v"]) + @test_throws CompositionError aldex2(-x, ["a", "b"], ["u", "u", "v", "v"]) + end +end diff --git a/test/runtests.jl b/test/runtests.jl index d9c6edc..449032b 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -17,4 +17,5 @@ include("mutants.jl") include("unit_core.jl") include("property_clr.jl") include("property_bh.jl") + include("property_aldex2.jl") end From dd3699523d6ee466dc17ab33b003a6d9ce976cfc Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Fri, 2 Oct 2026 15:06:10 +0100 Subject: [PATCH 2/7] Oracle: gut + soil fixtures from Nearing et al. 2022 (CC BY 4.0), reproducible builder, DATASETS.md Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_019Y6e175rh1LbrsEhQvCrJ1 --- docs/DATASETS.md | 50 +++ test/oracle/Project.toml | 3 + test/oracle/datasets.jl | 24 +- test/oracle/fixtures/gut_counts.tsv | 203 +++++++++++++ test/oracle/fixtures/gut_counts.tsv.license | 4 + test/oracle/fixtures/gut_groups.tsv | 109 +++++++ test/oracle/fixtures/gut_groups.tsv.license | 4 + test/oracle/fixtures/soil_counts.tsv | 301 +++++++++++++++++++ test/oracle/fixtures/soil_counts.tsv.license | 4 + test/oracle/fixtures/soil_groups.tsv | 64 ++++ test/oracle/fixtures/soil_groups.tsv.license | 4 + test/oracle/make_fixtures.jl | 105 +++++++ test/oracle/runoracle.jl | 2 +- 13 files changed, 874 insertions(+), 3 deletions(-) create mode 100644 docs/DATASETS.md create mode 100644 test/oracle/fixtures/gut_counts.tsv create mode 100644 test/oracle/fixtures/gut_counts.tsv.license create mode 100644 test/oracle/fixtures/gut_groups.tsv create mode 100644 test/oracle/fixtures/gut_groups.tsv.license create mode 100644 test/oracle/fixtures/soil_counts.tsv create mode 100644 test/oracle/fixtures/soil_counts.tsv.license create mode 100644 test/oracle/fixtures/soil_groups.tsv create mode 100644 test/oracle/fixtures/soil_groups.tsv.license create mode 100644 test/oracle/make_fixtures.jl diff --git a/docs/DATASETS.md b/docs/DATASETS.md new file mode 100644 index 0000000..8301e11 --- /dev/null +++ b/docs/DATASETS.md @@ -0,0 +1,50 @@ + + + +# Oracle datasets + +The R-reference oracle (`test/oracle/runoracle.jl`) compares each native method +with its Bioconductor implementation on three two-group count tables. + +| Name | Kind | Samples | Features | Groups | Known answer | +|---|---|---|---|---|---| +| `mock` | synthetic, generated in `test/oracle/datasets.jl` | 20 | 40 | a 10 / b 10 | yes: features 1–3 up 8×, 4–5 down 4× | +| `gut` | stool 16S, Parkinson's disease vs healthy controls | 108 | 202 | H 55 / PAR 53 | no | +| `soil` | blueberry soil vs rhizosphere 16S | 63 | 300 | Soil 39 / Rhizosphere 24 | no | + +`mock` is not a MetaManifold fixture; that repository holds no count-table +fixtures. Real tables have no ground truth, so for `gut` and `soil` the oracle +checks agreement with R only. + +## Source and licence of `gut` and `soil` + +Both come from the deposit accompanying Nearing et al. (2022), which compared +differential-abundance methods on 38 two-group 16S datasets: + +- Nearing J (2021). *16S_rRNA_Microbiome_Datasets*. figshare. + doi:[10.6084/m9.figshare.14531724.v1](https://doi.org/10.6084/m9.figshare.14531724.v1). + Licence **CC BY 4.0** (as stated by the figshare record). +- Nearing JT et al. (2022). Microbiome differential abundance methods produce + different results across 38 datasets. *Nat Commun* 13:342. + doi:10.1038/s41467-022-28034-z. + +File: `DA_COMPARE_DATA_21_03_08.tar.gz`, 253,151,868 bytes, md5 +`3bf04686142ba000b3b6f7825cc1a606` (as published by figshare), sha256 +`53337642e26735fc138ed17089f6a467135719413bafbd1f9e5bff048c164b84`. +Members used: `Hackathon/Studies/par_scheperjans/` and +`Hackathon/Studies/Blueberry/`, the raw `*_ASVs_table.tsv` (not the rarefied +`*_rare.tsv`) and the metadata TSV (`comparison` column). + +**Changes made** (CC BY 4.0 §3(a)(1)(B)): samples intersected with the +metadata; features kept if present in ≥ 25% of samples, then at most the 300 +most prevalent; transposed to the package's samples × features convention at +load time. `test/oracle/make_fixtures.jl` reproduces the fixtures exactly from +the checksummed tarball. Each fixture carries a REUSE `.license` sidecar. + +The deposit's CC BY 4.0 covers these processed tables. The licences of the +original studies behind each table were not separately verified, and the +original-study citations are not recorded here because they were not confirmed +from the deposit itself. + +The fixture data are CC BY 4.0, not MPL-2.0; they are test data only and are +not part of the package's loaded code. diff --git a/test/oracle/Project.toml b/test/oracle/Project.toml index 30dec19..6aeb3ad 100644 --- a/test/oracle/Project.toml +++ b/test/oracle/Project.toml @@ -1,8 +1,11 @@ [deps] CompositionalDA = "a77efed1-127c-5b9d-bf19-e0eccfa50304" DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +DelimitedFiles = "8bb1440f-4735-579b-a4ab-409b98df4dab" Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" +Downloads = "f43a241f-c20a-4ad4-852c-f6b1247861c6" RCall = "6f49c342-dc21-5d91-9882-a32aef131414" +SHA = "ea8e919c-243c-51af-8825-aaa63cd721ce" StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" diff --git a/test/oracle/datasets.jl b/test/oracle/datasets.jl index e7ddb23..77c18a8 100644 --- a/test/oracle/datasets.jl +++ b/test/oracle/datasets.jl @@ -2,8 +2,8 @@ # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) # # Oracle datasets. `mock` is synthetic with a known answer. The public gut and -# soil tables are fetched by checksum at run time and their sources and licences -# are recorded in docs/DATASETS.md. +# soil tables are small filtered fixtures committed under fixtures/ (CC BY 4.0); +# their source, licence and filter are recorded in docs/DATASETS.md. using Distributions: Multinomial, LogNormal using StableRNGs @@ -30,3 +30,23 @@ function mock_dataset(; seed::Integer = 2026) counts = permutedims(reduce(hcat, rows)) return counts, ["mock$j" for j in 1:d], vcat(fill("a", n), fill("b", n)), ["mock$j" for j in 1:5] end + +using DelimitedFiles: readdlm + +""" + fixture_dataset(name) -> (counts, features, groups, truth) + +Load a committed public fixture (`"gut"` or `"soil"`) as a samples × features +count matrix. These are real data with no known answer, so `truth` is empty. +Sources, licence and the filter that produced them are in docs/DATASETS.md; +`make_fixtures.jl` rebuilds them from the checksummed deposit. +""" +function fixture_dataset(name::AbstractString) + dir = joinpath(@__DIR__, "fixtures") + t = readdlm(joinpath(dir, "$(name)_counts.tsv"), '\t', String; comments = false) + g = readdlm(joinpath(dir, "$(name)_groups.tsv"), '\t', String; comments = false) + samples = t[1, 2:end] + group = Dict(g[i, 1] => g[i, 2] for i in 2:size(g, 1)) + counts = permutedims(parse.(Int, t[2:end, 2:end])) + return counts, t[2:end, 1], [group[s] for s in samples], String[] +end diff --git a/test/oracle/fixtures/gut_counts.tsv b/test/oracle/fixtures/gut_counts.tsv new file mode 100644 index 0000000..b5f1627 --- /dev/null +++ b/test/oracle/fixtures/gut_counts.tsv @@ -0,0 +1,203 @@ +feature parkinsonfecalbacteria.C1 parkinsonfecalbacteria.C5 parkinsonfecalbacteria.C14 parkinsonfecalbacteria.C15 parkinsonfecalbacteria.C18 parkinsonfecalbacteria.C19 parkinsonfecalbacteria.C21 parkinsonfecalbacteria.C24 parkinsonfecalbacteria.C26 parkinsonfecalbacteria.C32 parkinsonfecalbacteria.C34 parkinsonfecalbacteria.C35 parkinsonfecalbacteria.C44 parkinsonfecalbacteria.C46 parkinsonfecalbacteria.C49 parkinsonfecalbacteria.C51 parkinsonfecalbacteria.C52 parkinsonfecalbacteria.C58 parkinsonfecalbacteria.C63 parkinsonfecalbacteria.C68 parkinsonfecalbacteria.C70 parkinsonfecalbacteria.C72 parkinsonfecalbacteria.C73 parkinsonfecalbacteria.C74 parkinsonfecalbacteria.C76 parkinsonfecalbacteria.C79 parkinsonfecalbacteria.C80 parkinsonfecalbacteria.C82 parkinsonfecalbacteria.C85 parkinsonfecalbacteria.C86 parkinsonfecalbacteria.C87 parkinsonfecalbacteria.C88 parkinsonfecalbacteria.C89 parkinsonfecalbacteria.C90 parkinsonfecalbacteria.C95 parkinsonfecalbacteria.C98 parkinsonfecalbacteria.C102 parkinsonfecalbacteria.C103 parkinsonfecalbacteria.C104 parkinsonfecalbacteria.C105 parkinsonfecalbacteria.C107 parkinsonfecalbacteria.C111 parkinsonfecalbacteria.C114 parkinsonfecalbacteria.C116 parkinsonfecalbacteria.C118 parkinsonfecalbacteria.C119 parkinsonfecalbacteria.C123 parkinsonfecalbacteria.C124 parkinsonfecalbacteria.C134 parkinsonfecalbacteria.C135 parkinsonfecalbacteria.C136 parkinsonfecalbacteria.C137 parkinsonfecalbacteria.C142 parkinsonfecalbacteria.C143 parkinsonfecalbacteria.C146 parkinsonfecalbacteria.P8 parkinsonfecalbacteria.P9 parkinsonfecalbacteria.P11 parkinsonfecalbacteria.P12 parkinsonfecalbacteria.P16 parkinsonfecalbacteria.P17 parkinsonfecalbacteria.P24 parkinsonfecalbacteria.P26 parkinsonfecalbacteria.P28 parkinsonfecalbacteria.P31 parkinsonfecalbacteria.P34 parkinsonfecalbacteria.P37 parkinsonfecalbacteria.P41 parkinsonfecalbacteria.P42 parkinsonfecalbacteria.P43 parkinsonfecalbacteria.P45 parkinsonfecalbacteria.P50 parkinsonfecalbacteria.P51 parkinsonfecalbacteria.P53 parkinsonfecalbacteria.P56 parkinsonfecalbacteria.P57 parkinsonfecalbacteria.P59 parkinsonfecalbacteria.P61 parkinsonfecalbacteria.P63 parkinsonfecalbacteria.P65 parkinsonfecalbacteria.P66 parkinsonfecalbacteria.P68 parkinsonfecalbacteria.P69 parkinsonfecalbacteria.P71 parkinsonfecalbacteria.P73 parkinsonfecalbacteria.P74 parkinsonfecalbacteria.P77 parkinsonfecalbacteria.P79 parkinsonfecalbacteria.P83 parkinsonfecalbacteria.P85 parkinsonfecalbacteria.P87 parkinsonfecalbacteria.P88 parkinsonfecalbacteria.P93 parkinsonfecalbacteria.P94 parkinsonfecalbacteria.P95 parkinsonfecalbacteria.P99 parkinsonfecalbacteria.P100 parkinsonfecalbacteria.P103 parkinsonfecalbacteria.P105 parkinsonfecalbacteria.P107 parkinsonfecalbacteria.P112 parkinsonfecalbacteria.P113 parkinsonfecalbacteria.P114 parkinsonfecalbacteria.P115 parkinsonfecalbacteria.P116 parkinsonfecalbacteria.P117 parkinsonfecalbacteria.P119 parkinsonfecalbacteria.P120 +denovo616 1 2 0 0 0 1 1 0 0 0 0 6 0 0 5 0 1 0 0 0 0 5 0 0 0 1 1 0 1 0 0 0 0 0 2 0 0 0 0 0 1 0 5 0 0 2 0 0 0 1 0 3 3 0 0 0 0 3 0 0 0 3 13 0 2 0 0 6 1 1 0 0 4 0 2 0 0 0 0 0 1 0 0 0 0 2 0 0 0 0 0 1 0 1 0 9 1 1 1 0 0 0 0 0 0 0 0 0 +denovo429 0 0 0 0 0 0 1 1 0 0 0 12 0 0 1 0 1 0 0 0 0 4 1 1 2 2 1 0 0 1 3 0 0 0 0 0 0 4 2 2 0 0 0 2 0 0 0 0 2 3 3 3 0 7 0 0 0 3 0 1 2 8 0 0 0 7 0 0 0 0 0 0 1 0 0 3 0 1 0 0 7 0 0 0 0 0 0 0 2 1 0 0 0 2 0 0 0 1 1 0 36 0 4 0 3 1 0 0 +denovo421 0 0 0 0 0 3 0 0 0 0 0 0 0 1 0 3 9 3 2 0 0 0 1 0 4 0 0 1 4 0 4 0 6 2 1 0 0 0 1 5 0 2 12 0 0 0 0 0 4 0 3 0 2 0 0 0 0 0 0 0 0 3 0 0 1 3 0 10 3 0 1 0 4 0 0 1 9 0 0 0 0 0 3 0 0 0 0 9 8 0 0 0 0 0 6 0 0 0 0 3 0 0 0 0 7 0 0 0 +denovo426 0 0 3 0 0 0 0 0 1 0 0 8 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 5 0 0 10 2 3 0 0 0 0 0 0 3 0 1 3 0 0 0 6 0 0 0 2 12 0 1 1 0 0 8 4 0 0 0 8 4 1 1 0 0 0 5 0 0 0 20 0 1 0 0 0 1 0 0 0 0 0 2 2 0 11 0 0 0 0 0 1 4 1 0 +denovo427 0 1 3 0 2 0 0 5 15 0 0 0 0 4 0 0 3 0 0 0 0 0 0 0 0 0 1 0 1 2 0 0 0 3 0 0 0 0 0 0 1 0 1 0 3 0 0 0 0 4 1 0 1 0 14 0 0 0 0 0 0 3 0 3 13 0 4 0 0 4 0 0 0 0 0 2 0 0 7 0 0 1 0 0 0 0 0 0 0 2 0 0 3 0 0 8 0 0 0 0 1 0 0 5 2 0 0 0 +denovo674 0 0 0 0 0 3 0 0 0 0 0 0 1 2 0 0 0 2 0 4 3 0 1 0 3 0 0 2 2 0 0 2 0 0 0 0 0 0 0 1 0 0 0 0 3 0 1 0 0 0 0 0 1 0 2 0 0 0 1 0 7 4 0 0 0 17 0 0 5 0 0 2 0 1 0 0 0 0 0 0 0 0 6 0 0 0 0 0 4 2 0 0 0 6 0 2 0 0 0 0 0 0 0 1 0 0 0 1 +denovo434 0 0 0 0 0 0 1 0 3 0 0 0 0 1 2 0 0 0 0 2 0 0 5 0 0 0 0 2 0 0 0 1 0 0 0 0 0 0 0 8 0 0 0 12 0 0 4 7 1 1 0 47 2 0 5 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 4 9 0 0 0 0 0 0 0 2 0 16 0 0 1 0 3 0 0 0 0 6 0 0 0 0 0 2 0 +denovo384 0 0 0 0 0 0 0 9 1 0 0 0 0 0 0 0 4 0 0 0 0 0 0 1 0 1 0 3 2 0 0 0 0 5 1 3 0 12 0 0 0 0 0 0 0 0 0 0 0 0 1 0 11 7 10 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 40 0 0 3 10 0 2 0 0 6 1 0 3 4 0 0 0 0 7 0 0 5 2 0 0 0 0 0 0 0 0 0 +denovo381 0 1 0 0 0 1 0 0 2 1 0 0 0 0 0 8 0 0 0 1 8 0 1 0 0 0 1 0 0 0 0 43 0 1 0 2 0 1 4 1 1 0 0 0 0 0 0 0 5 0 0 1 0 3 0 0 3 0 0 2 1 8 0 0 0 0 0 0 8 2 0 0 1 3 0 0 0 0 2 0 0 6 0 0 1 1 0 1 6 0 0 4 0 0 0 17 0 3 0 0 0 0 0 4 8 0 0 5 +denovo380 0 0 0 1 0 2 2 0 0 3 0 5 0 2 0 0 10 0 12 0 0 0 0 0 0 0 1 4 0 2 0 0 0 0 0 11 31 0 0 0 0 1 0 0 4 0 1 0 1 0 0 20 0 0 2 1 0 1 0 0 0 0 0 0 1 2 0 0 0 0 0 2 0 0 18 0 0 1 0 0 0 0 0 0 3 0 0 0 3 1 0 0 0 1 0 0 0 0 0 1 3 0 0 5 0 6 0 1 +denovo659 0 4 3 0 0 0 0 4 2 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 14 1 14 0 1 5 4 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 7 0 0 2 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 3 0 3 0 0 0 +denovo269 0 0 0 1 0 0 12 0 0 0 0 16 0 0 0 0 0 0 5 0 0 6 0 0 1 0 0 0 0 9 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 6 0 2 0 0 0 0 2 0 0 4 1 2 4 0 59 0 0 5 27 0 0 0 0 0 3 0 0 2 7 0 0 0 0 0 0 0 10 2 0 0 19 0 0 4 0 0 8 0 0 0 0 0 0 0 0 +denovo108 1 9 0 0 1 1 0 3 1 0 0 17 0 0 6 2 0 0 0 0 0 0 10 5 1 29 0 2 0 0 0 37 0 42 37 0 0 0 9 0 0 6 25 1 0 0 2 0 0 0 0 0 2 2 0 0 0 0 7 0 0 4 1 12 5 40 5 0 0 7 0 2 0 6 0 8 5 0 0 2 12 0 0 0 0 0 8 0 0 21 1 0 28 11 9 0 0 6 15 0 12 0 9 0 27 0 10 11 +denovo107 3 1 4 1 16 0 0 2 1 0 11 9 1 0 1 6 12 2 3 1 6 0 6 1 5 1 1 1 8 3 0 0 0 0 97 0 0 42 2 0 11 0 1 0 5 11 0 0 1 0 3 20 9 14 1 0 0 0 0 0 0 35 0 1 1 12 0 0 5 7 0 4 0 2 0 5 0 0 0 2 0 5 2 1 4 6 0 0 2 0 5 0 0 2 0 0 0 3 2 1 0 0 0 0 1 38 7 1 +denovo105 3 0 9 2 1 0 5 2 0 6 0 8 0 6 5 0 0 0 8 0 0 2 0 0 3 42 2 9 0 52 43 0 0 0 1 0 0 0 0 12 3 1 0 0 0 22 0 0 10 0 0 0 10 0 5 0 0 0 0 5 26 0 0 1 4 4 6 33 0 1 24 6 0 0 0 0 0 4 4 3 6 3 5 0 0 0 13 0 15 3 5 0 1 28 0 0 8 0 0 12 1 2 0 0 0 7 13 0 +denovo104 0 10 5 0 1 1 0 24 0 0 0 0 13 1 0 0 0 0 0 0 0 61 0 0 0 0 3 2 0 6 0 0 14 0 0 0 0 0 14 2 0 6 0 0 3 0 7 19 14 0 0 0 8 9 0 0 0 0 0 0 0 12 0 0 40 0 3 0 0 9 2 1 4 22 0 30 0 0 10 15 2 1 0 0 0 0 0 21 0 0 0 3 54 0 0 0 22 16 0 8 0 0 0 0 58 0 16 1 +denovo102 6 0 4 22 0 1 25 1 0 1 38 19 1 5 1 0 3 9 0 1 2 11 3 2 3 8 10 2 5 4 0 9 2 5 3 1 12 0 0 11 0 0 0 3 0 0 1 6 3 0 10 0 5 1 0 8 0 0 3 0 14 0 9 12 0 5 0 0 0 10 0 7 3 3 0 2 0 0 8 1 0 4 20 0 0 9 0 0 4 6 0 9 0 11 0 23 7 10 5 2 9 11 2 4 1 0 0 1 +denovo101 0 0 17 0 0 0 0 0 0 0 0 22 0 0 0 9 0 0 13 1 13 5 0 0 11 0 0 0 0 15 0 0 16 11 21 64 0 18 0 4 0 5 0 0 57 0 0 0 0 0 0 0 0 0 0 31 0 0 4 0 0 0 11 0 0 17 0 0 0 0 0 6 0 0 43 0 9 0 0 14 0 0 0 0 0 0 0 0 0 0 0 0 6 2 0 0 3 0 8 15 0 0 8 0 14 0 0 0 +denovo100 1 0 0 0 0 0 3 4 0 1 0 46 3 0 2 13 0 9 0 0 0 6 0 6 11 5 12 9 1 0 0 2 19 0 0 0 0 28 10 3 10 0 2 1 13 0 4 0 1 3 5 0 0 2 1 0 0 0 0 24 0 9 4 1 0 1 26 18 0 1 0 2 0 2 3 0 0 16 1 47 1 20 3 0 0 0 11 0 2 13 0 3 0 0 1 0 1 0 0 9 0 0 11 0 1 2 3 1 +denovo91 0 0 0 3 0 0 1 0 20 0 12 0 0 0 0 29 3 34 3 0 5 25 5 0 1 0 14 4 0 0 34 0 0 26 43 0 5 0 1 15 10 0 2 0 11 32 2 0 0 7 2 19 2 5 2 0 0 3 0 1 2 1 0 2 4 0 0 6 0 0 2 7 0 0 2 2 0 8 0 4 7 0 5 0 0 10 5 0 3 32 0 10 5 5 0 5 2 4 0 0 4 0 0 5 0 2 1 0 +denovo96 1 0 2 0 1 4 5 0 0 1 39 0 1 1 0 0 0 0 0 6 0 0 7 10 0 0 0 7 4 0 0 2 0 12 34 0 0 0 2 0 1 10 0 2 0 0 3 16 15 0 9 0 0 15 0 2 0 0 0 0 7 0 0 0 0 29 5 0 0 0 6 0 19 16 0 10 0 2 0 0 39 0 0 0 14 0 0 0 10 48 0 0 16 0 0 37 21 8 11 0 29 2 0 0 0 0 0 0 +denovo97 6 0 6 1 0 2 12 0 0 0 3 8 1 0 5 31 2 13 5 1 0 21 6 11 1 13 10 0 0 9 19 0 0 59 0 0 4 3 2 28 9 8 0 0 0 0 0 1 3 1 14 22 16 0 5 0 0 0 1 2 1 2 0 6 5 0 2 0 0 1 1 3 6 2 5 1 0 1 5 0 18 9 17 0 0 4 0 0 0 0 4 1 2 20 0 0 0 0 2 4 0 0 0 5 2 16 7 0 +denovo94 0 0 9 0 0 0 0 0 0 1 0 0 0 1 0 1 0 10 0 0 0 0 0 0 0 0 39 0 2 0 0 0 9 0 19 0 22 0 0 2 0 0 0 0 0 0 0 0 0 17 4 0 9 0 4 0 0 0 274 0 4 0 0 2 0 0 1 2 9 20 0 0 0 0 0 19 0 7 7 0 0 0 3 0 4 0 0 1 0 0 0 0 2 3 0 0 4 0 0 1 0 0 0 0 29 7 0 0 +denovo95 28 0 2 0 0 0 0 0 2 0 0 3 0 3 0 8 3 0 8 1 1 12 0 0 5 2 0 0 0 91 7 6 0 3 9 10 0 0 0 0 4 9 0 0 12 0 7 0 0 0 0 0 0 3 21 7 5 0 1 38 0 2 1 1 1 3 0 0 5 0 0 6 0 9 29 0 6 0 0 0 31 3 0 40 0 0 25 0 3 0 0 2 14 0 0 1 12 0 7 2 2 9 6 3 0 79 0 0 +denovo99 0 10 6 14 2 2 1 4 24 0 30 4 31 13 3 10 1 0 2 2 12 0 0 0 0 0 0 7 1 5 4 0 0 1 0 0 1 9 7 7 3 1 0 0 22 1 4 0 2 2 0 0 5 0 25 0 0 0 0 0 1 1 0 8 2 1 11 0 43 6 0 1 0 8 2 6 0 1 1 0 1 0 6 0 1 0 0 46 12 0 2 0 1 9 0 1 2 0 2 0 1 0 0 5 3 1 5 5 +denovo7 29 2 0 0 1 12 41 0 0 0 81 7 0 1 0 0 0 8 0 6 5 100 0 11 0 32 28 0 6 0 0 0 17 3 0 0 0 0 44 88 4 1 0 0 0 10 1 0 14 29 12 0 12 8 0 0 0 16 0 0 1 59 0 47 0 17 0 0 0 0 33 9 0 29 0 33 0 1 0 6 17 43 0 0 0 2 0 0 40 371 1 30 27 58 0 0 49 305 40 3 113 852 327 13 31 0 4 32 +denovo343 4 0 0 2 2 3 0 0 17 3 0 5 3 0 0 0 0 0 0 0 0 0 1 16 0 0 2 0 0 2 0 0 1 0 0 0 0 0 0 1 6 0 4 0 0 0 0 0 0 0 0 0 1 8 1 0 0 0 0 1 7 4 0 0 4 2 3 0 0 1 1 0 1 0 0 0 0 0 2 0 0 0 0 0 2 0 1 0 0 13 0 5 8 12 0 0 0 0 0 1 2 0 0 0 0 9 0 0 +denovo349 0 0 1 7 3 2 2 5 6 0 0 0 4 1 3 7 4 1 1 0 1 0 0 0 0 0 0 0 0 5 1 0 0 0 0 0 4 3 1 3 0 0 0 0 1 4 6 0 0 4 0 0 0 0 6 1 0 1 0 0 0 0 0 2 1 0 6 0 0 6 0 0 0 0 0 4 0 0 3 0 1 0 1 0 1 0 0 8 3 0 1 0 0 0 0 3 0 0 2 0 0 0 0 0 2 2 3 0 +denovo165 1 0 0 0 7 1 1 8 0 0 0 0 0 1 0 15 8 15 0 0 0 0 8 0 0 0 1 3 0 15 6 11 0 0 0 0 4 0 1 0 5 0 0 0 10 0 6 1 0 0 0 0 1 5 1 0 11 0 0 5 7 0 0 0 2 0 3 0 0 0 0 0 11 3 0 3 0 1 4 14 0 8 0 0 2 0 1 6 0 24 2 0 7 0 0 0 1 0 0 2 11 0 0 1 0 8 0 0 +denovo163 14 0 0 1 10 9 1 5 1 2 0 0 4 9 0 4 0 1 0 4 0 0 0 4 9 0 0 13 1 3 0 2 0 0 21 0 0 0 11 3 0 1 0 1 16 0 15 2 9 2 0 0 0 2 2 1 0 3 3 1 0 0 0 27 11 0 6 4 0 9 1 2 2 2 0 2 0 5 15 1 2 4 6 0 33 0 0 7 6 0 14 5 1 6 0 1 1 1 5 6 4 0 0 1 0 10 0 0 +denovo578 0 3 0 0 0 0 1 2 1 0 0 0 0 0 0 0 0 0 5 0 0 5 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 3 3 2 0 0 1 2 0 0 0 0 0 5 5 1 0 1 2 8 0 0 0 0 0 0 0 0 0 0 34 8 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 4 0 0 3 5 0 0 0 4 0 +denovo575 4 0 0 0 0 2 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 2 1 2 6 0 0 0 3 1 0 3 0 0 5 0 1 2 4 0 2 0 0 10 0 1 0 0 1 0 0 0 0 0 1 5 1 0 1 2 0 0 5 0 0 0 1 0 0 0 0 12 0 3 2 0 1 3 0 0 1 0 3 0 0 1 0 0 0 0 +denovo365 0 0 0 0 0 1 0 3 2 0 1 1 0 0 0 2 0 1 0 0 0 3 0 0 3 1 9 0 0 0 1 0 1 9 8 1 0 4 10 7 0 0 0 1 0 0 3 0 1 0 0 1 0 1 0 0 3 0 0 0 0 3 0 1 1 1 0 8 4 2 1 0 0 1 1 8 1 4 6 0 2 15 1 0 1 0 0 0 0 5 1 0 0 4 0 0 0 0 5 2 4 0 0 2 7 1 2 0 +denovo146 7 0 0 0 0 0 0 0 0 3 10 0 0 0 0 6 0 0 0 0 0 0 0 0 0 26 19 3 0 20 0 0 0 0 0 0 0 0 0 0 0 44 0 0 15 0 0 13 0 0 1 0 0 0 0 0 0 7 0 0 0 5 0 1 0 0 1 0 0 0 0 0 7 30 0 80 0 0 4 0 0 40 0 0 0 0 0 17 0 0 0 35 0 0 0 0 13 0 17 3 0 0 0 0 0 0 24 4 +denovo145 0 0 0 0 10 0 0 0 0 0 5 0 0 0 0 0 0 0 0 1 0 22 4 0 1 0 0 0 24 0 0 0 0 0 1 73 0 18 0 0 13 2 0 0 0 0 2 0 5 0 0 0 14 0 0 8 0 9 0 0 0 4 0 8 0 0 0 0 0 3 0 32 18 0 10 0 0 0 0 2 1 0 0 0 0 0 0 0 1 30 0 0 0 0 58 0 0 3 0 5 28 0 0 3 35 0 0 3 +denovo1124 0 2 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 3 1 0 0 0 2 0 0 1 0 0 0 2 0 0 1 0 3 0 0 3 0 0 0 0 0 4 0 0 0 0 1 0 0 2 1 0 0 1 2 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 1 0 1 1 0 0 0 0 2 1 1 0 1 0 0 0 0 1 0 1 0 +denovo553 0 0 0 0 0 0 0 0 0 1 0 4 3 0 0 0 0 7 0 1 0 0 1 2 12 0 0 2 2 3 0 0 0 1 9 0 0 0 4 4 0 2 0 0 4 0 0 0 1 2 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 2 0 3 0 3 0 0 0 0 0 1 0 0 2 0 1 0 0 0 0 0 0 0 0 6 8 4 0 0 0 0 0 6 0 0 0 0 +denovo555 4 0 0 0 0 0 0 1 0 0 9 2 0 0 0 0 0 0 0 0 4 0 0 0 0 3 1 0 2 1 0 0 0 0 0 6 0 5 0 5 0 0 0 0 0 0 3 0 0 0 0 0 0 3 0 0 2 0 2 0 0 0 4 2 0 0 0 0 0 0 0 0 0 4 4 0 0 1 6 1 0 4 0 0 0 0 0 7 15 0 0 3 0 0 12 0 0 0 2 0 0 0 0 2 0 2 0 0 +denovo300 0 0 0 0 0 0 1 0 15 0 30 2 2 2 0 0 0 0 0 4 0 0 0 2 4 0 0 5 0 0 0 0 0 0 5 0 0 0 1 0 0 1 0 0 0 0 2 6 0 0 8 0 0 56 0 1 0 0 0 0 0 0 0 3 0 0 0 0 0 0 1 0 0 4 0 0 0 1 0 5 0 0 0 0 0 0 1 0 0 15 0 14 1 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 +denovo303 2 0 1 3 0 0 0 0 0 0 2 3 0 0 2 0 0 16 0 0 0 2 0 1 0 0 1 0 1 0 3 0 0 0 3 1 0 1 0 0 2 0 6 0 0 1 0 0 0 0 3 3 1 0 0 0 0 8 13 3 1 6 2 0 0 0 12 3 0 0 3 0 24 0 4 0 1 0 0 1 0 0 1 2 0 1 0 0 1 1 1 0 0 0 0 5 0 3 1 0 0 0 14 0 0 0 2 0 +denovo539 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 2 6 0 0 0 3 2 0 0 0 3 0 3 1 0 0 0 0 0 5 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 2 0 0 0 1 0 0 0 2 0 2 0 0 0 0 8 0 0 0 0 3 0 0 0 4 0 1 4 0 0 12 0 0 0 0 0 2 15 0 0 0 8 0 2 0 2 4 3 0 0 0 1 0 +denovo2 26 0 0 0 0 20 23 0 0 14 0 56 2 89 0 0 121 0 0 0 26 637 22 1 33 108 0 14 1 285 0 149 27 372 164 0 139 0 29 0 7 0 0 72 8 0 59 6 15 0 34 29 0 0 449 25 83 0 4 0 31 27 0 189 13 16 0 171 0 0 36 0 42 5 0 30 71 31 13 6 0 0 0 210 41 0 23 38 5 136 0 11 108 0 91 0 0 20 0 48 89 12 80 0 0 0 162 0 +denovo322 0 0 0 0 0 0 0 0 3 0 0 0 1 0 0 0 0 32 0 2 3 0 0 2 0 0 0 0 0 2 6 0 0 0 0 0 0 0 1 1 5 2 0 0 2 0 0 0 3 1 0 0 2 0 0 24 0 1 0 0 0 3 0 0 1 0 1 28 0 0 0 7 0 0 0 1 0 5 0 0 3 0 2 0 3 2 0 0 5 3 0 0 1 3 0 1 4 0 1 0 4 0 0 0 0 0 1 0 +denovo326 0 0 0 0 0 1 3 7 2 0 0 0 0 0 0 0 0 3 0 1 0 0 0 3 1 1 0 2 1 3 0 0 19 2 12 0 0 7 1 9 2 0 0 2 1 0 2 5 0 0 0 0 1 0 0 0 0 0 0 2 1 0 0 2 0 2 4 0 0 0 5 1 6 2 0 0 0 0 0 4 10 24 0 0 2 2 1 0 2 7 3 0 0 0 0 2 5 7 5 0 1 3 0 2 0 0 2 2 +denovo328 0 3 3 2 0 0 0 2 0 2 0 1 0 2 0 7 3 0 1 0 0 17 2 0 8 0 2 0 0 0 0 0 0 0 6 0 0 0 1 3 2 1 8 11 0 0 0 0 0 3 0 7 0 0 0 0 0 1 0 6 0 3 11 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 3 0 7 4 4 0 0 0 0 0 0 0 0 2 0 8 0 13 0 0 4 4 3 2 11 0 4 0 9 0 +denovo183 0 0 0 1 0 1 0 6 0 0 0 1 0 0 0 0 0 0 0 7 3 0 14 0 0 4 0 1 0 0 0 0 0 0 9 0 6 0 0 0 0 0 89 22 0 0 0 0 0 0 3 0 11 17 13 0 0 0 0 14 4 0 0 0 0 0 0 6 0 0 0 0 0 0 0 6 0 0 0 0 3 0 1 0 0 0 0 0 0 0 0 2 3 0 0 0 0 0 0 1 120 0 0 0 0 3 0 4 +denovo518 2 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 1 2 0 4 1 0 2 3 3 0 0 20 0 5 0 3 0 5 2 0 2 0 1 0 4 0 0 0 0 0 11 1 0 1 1 0 0 10 2 0 0 0 0 0 1 0 0 0 0 0 0 4 0 0 0 1 0 0 0 2 2 0 0 0 0 1 1 7 1 0 1 0 2 1 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 +denovo514 0 0 3 2 0 2 1 0 0 0 0 0 0 4 0 0 4 1 1 0 3 0 0 1 1 1 0 2 0 0 0 0 0 0 1 5 8 0 2 0 0 0 0 0 9 15 4 0 0 0 0 0 0 5 4 0 0 2 0 0 0 0 0 1 0 0 0 0 0 0 0 2 0 3 1 1 0 1 1 1 0 0 0 3 4 0 1 6 1 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0 +denovo700 2 0 0 0 0 0 1 1 0 1 0 4 0 0 0 0 0 0 2 0 1 0 0 0 0 1 2 0 0 1 0 0 0 3 8 0 0 0 0 0 0 0 0 0 2 0 2 10 0 0 0 0 0 6 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 1 0 0 0 0 6 0 2 0 8 0 0 2 0 0 0 0 +denovo706 0 0 1 1 0 0 3 1 0 0 0 4 0 0 0 0 0 1 0 0 0 1 0 0 0 3 2 1 0 1 0 0 6 1 1 0 0 2 0 1 1 0 1 0 0 1 3 1 2 0 2 0 0 2 0 0 1 0 2 0 0 1 0 0 0 0 2 0 0 0 3 1 0 4 0 1 0 1 0 0 2 0 1 0 0 1 0 0 1 0 0 3 20 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 +denovo249 5 10 0 4 4 0 0 7 36 0 1 0 2 0 0 0 1 17 0 0 0 0 0 0 0 0 0 2 5 0 0 0 1 0 1 0 0 2 0 0 1 1 2 0 0 0 3 2 0 0 0 0 0 0 2 0 26 5 0 0 0 15 0 0 0 0 8 0 0 0 0 0 2 0 0 7 0 1 1 0 3 0 0 0 14 0 8 4 0 7 13 0 1 0 0 3 0 0 0 13 0 1 0 0 0 9 0 0 +denovo288 0 6 0 0 0 0 0 0 3 0 1 0 0 2 7 0 0 0 0 0 0 0 2 0 0 0 19 0 0 2 0 8 0 79 17 0 0 0 1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 1 2 3 0 0 0 0 0 0 0 0 0 2 0 0 0 2 0 0 1 0 13 0 0 0 2 8 0 0 0 11 0 1 0 27 0 0 2 0 0 9 0 0 0 5 0 0 1 0 +denovo285 0 1 0 16 1 4 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 2 5 0 2 0 0 0 0 1 0 15 0 0 0 0 2 0 8 3 0 0 0 0 0 3 1 0 0 0 0 0 0 0 32 0 21 0 0 0 1 1 0 0 0 0 0 0 60 0 0 4 5 1 0 3 0 1 2 0 0 0 2 0 0 0 0 1 7 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 2 1 0 +denovo282 3 0 6 3 3 0 0 3 7 1 0 2 0 3 0 5 0 0 0 0 7 0 4 27 8 0 6 1 6 0 4 0 0 2 5 0 2 0 0 1 0 1 0 0 3 0 11 2 1 1 0 0 2 1 2 0 0 0 0 0 0 1 0 4 4 0 1 0 0 4 0 0 0 0 0 0 0 0 4 0 3 0 0 0 0 7 25 0 2 9 1 4 0 5 0 0 0 0 0 4 0 0 0 0 0 0 0 0 +denovo250 0 5 1 0 0 5 0 0 0 2 0 0 0 1 3 21 0 1 0 3 11 1 0 0 2 0 0 0 2 0 0 31 0 2 0 7 0 2 40 1 0 0 0 0 1 0 0 0 5 0 1 1 0 7 0 0 15 0 0 3 0 8 0 1 0 0 0 0 19 1 2 0 1 1 0 0 0 0 0 0 0 10 0 0 2 2 2 0 12 1 0 3 0 0 0 8 0 3 1 0 1 0 0 1 25 0 1 4 +denovo494 0 0 1 0 0 0 0 0 0 0 0 5 0 1 4 0 0 0 0 0 1 8 1 0 0 0 9 0 0 0 1 0 0 0 0 0 0 6 0 4 1 0 0 0 0 0 0 0 0 17 0 2 0 0 0 14 7 0 0 0 0 0 0 2 0 2 0 0 0 0 0 0 0 0 1 0 0 0 0 9 2 0 1 0 0 0 0 0 0 14 0 0 0 0 1 0 1 1 0 0 0 0 0 0 3 0 4 0 +denovo263 4 3 6 21 0 0 1 1 0 1 1 0 0 5 0 13 1 0 0 1 0 0 2 2 1 0 2 3 0 9 0 10 0 0 0 0 2 0 4 0 2 0 0 0 11 19 6 0 3 0 5 0 7 0 5 0 0 0 0 2 1 2 0 0 0 4 1 0 0 0 0 6 0 0 0 0 0 0 3 0 5 0 0 0 0 0 4 6 22 0 0 13 0 21 0 4 0 1 0 1 0 1 0 2 1 2 1 7 +denovo266 0 0 0 0 1 1 11 0 0 0 12 0 0 0 0 0 0 0 0 0 2 0 0 2 0 2 1 0 0 1 0 1 0 0 0 0 5 0 0 3 0 2 0 0 0 0 5 2 2 8 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 3 0 1 0 0 0 0 0 0 4 12 1 18 0 0 0 0 0 0 0 0 0 7 14 4 0 3 0 2 0 6 0 0 +denovo268 9 3 0 0 0 2 2 0 0 0 0 10 0 0 0 0 0 0 2 0 1 0 0 18 0 0 29 0 0 0 25 3 1 5 0 0 0 3 0 5 0 3 0 0 0 0 0 0 0 0 7 0 14 0 1 0 0 0 0 2 0 0 0 1 3 0 2 0 0 0 0 0 10 0 0 0 0 0 3 0 0 9 6 0 0 0 0 6 17 0 3 0 0 0 0 0 0 0 0 4 3 0 0 0 1 4 10 0 +denovo815 0 0 0 0 1 0 0 2 1 0 1 0 0 0 0 6 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 3 2 2 0 1 2 3 1 0 0 0 0 0 2 0 0 0 0 3 2 0 0 0 0 0 0 0 1 0 1 0 0 2 0 1 8 0 0 0 0 0 0 0 2 1 0 3 0 0 2 0 0 0 1 0 1 0 2 1 4 0 0 0 0 0 0 2 0 0 0 0 0 0 1 0 0 +denovo241 0 0 0 0 0 0 0 0 0 0 0 4 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 1 0 0 0 4 1 1 0 0 0 0 2 0 2 2 2 0 2 61 0 0 0 22 0 1 0 0 0 0 0 0 1 0 0 0 5 1 12 2 2 0 79 0 0 0 0 4 0 8 0 39 0 0 0 0 0 0 3 0 3 0 0 0 0 0 0 1 0 2 2 0 1 0 1 0 +denovo244 0 0 0 2 20 1 0 3 0 0 0 7 0 0 0 0 4 2 1 0 0 0 7 1 0 0 8 0 0 1 10 0 0 0 26 7 0 0 1 0 3 0 0 1 2 15 0 0 0 0 7 0 0 15 0 0 0 0 0 0 0 18 0 1 0 3 0 28 2 0 0 0 6 0 24 3 0 0 0 0 0 0 0 0 1 4 2 0 0 0 9 8 0 4 0 1 0 0 6 0 0 0 0 1 0 0 1 0 +denovo69 73 3 76 33 21 29 0 11 0 0 0 7 0 13 0 0 3 0 2 2 0 0 11 0 0 0 0 2 0 0 1 0 0 21 0 0 0 12 4 0 0 0 0 0 58 0 2 0 4 0 2 0 0 16 2 0 0 0 0 0 0 1 43 0 0 0 0 2 0 14 0 1 0 14 0 0 60 28 27 0 0 0 1 0 0 0 8 0 13 0 4 1 0 3 0 0 0 5 1 0 0 9 0 0 0 127 0 0 +denovo68 9 0 1 0 0 14 1 5 13 9 0 1 2 0 31 0 12 0 0 12 0 0 0 6 0 0 1 1 62 0 22 0 6 1 7 5 0 77 25 8 0 0 0 0 11 0 12 0 14 1 1 0 3 0 5 0 32 0 0 2 22 41 0 0 0 0 0 0 0 3 0 0 0 39 0 0 0 0 27 1 1 4 19 1 2 0 0 0 66 1 0 3 1 0 0 0 0 1 0 20 0 0 0 0 12 19 0 23 +denovo61 4 35 36 6 3 2 3 5 22 2 0 0 0 0 0 0 0 2 10 4 5 1 6 8 6 23 6 3 42 11 1 4 5 7 11 0 1 18 6 7 20 3 0 1 3 5 8 4 30 5 3 0 1 3 0 1 2 0 7 0 12 4 0 0 9 1 5 1 1 3 1 0 0 6 3 6 0 12 12 4 0 2 3 0 3 1 5 3 16 20 2 47 0 6 0 3 1 0 0 11 16 1 0 9 4 0 23 18 +denovo67 0 3 0 14 1 0 13 1 10 0 0 8 3 0 0 0 1 0 0 0 14 2 0 0 16 37 0 0 1 0 30 0 13 0 1 0 0 0 1 65 0 3 0 0 5 6 0 0 9 33 11 0 0 0 0 33 0 3 0 0 0 9 0 2 0 0 1 0 1 3 0 0 26 0 0 4 0 0 7 53 0 20 0 0 0 30 6 8 0 28 47 0 32 3 0 0 9 7 0 0 0 0 38 0 14 0 0 8 +denovo64 0 0 0 0 2 0 0 0 0 0 0 0 0 1 0 0 0 44 0 1 0 0 0 30 37 0 0 0 19 0 0 0 28 4 0 0 0 0 23 0 0 5 0 0 0 0 31 8 14 0 209 0 0 0 0 2 0 0 0 0 0 2 0 0 0 11 0 0 0 0 0 2 0 0 0 2 0 1 0 5 0 7 0 0 0 0 0 0 0 0 0 37 0 0 0 0 0 86 0 17 0 0 0 30 0 0 0 0 +denovo762 0 0 0 0 1 2 0 2 0 0 0 0 0 0 0 1 2 0 1 0 0 0 3 1 1 1 0 0 0 0 0 2 0 0 0 0 0 4 0 7 0 0 5 3 2 3 2 3 0 1 0 0 0 3 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 2 6 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 3 0 1 0 0 7 0 0 +denovo839 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 1 0 0 0 0 1 0 0 1 1 0 1 0 0 0 1 13 1 0 0 0 1 0 0 0 0 1 1 1 0 0 0 11 0 0 0 2 2 0 3 1 0 0 0 1 6 0 0 2 1 0 0 1 0 1 0 3 0 2 0 0 0 1 0 0 2 0 0 0 1 0 0 0 +denovo226 8 0 0 0 0 1 0 0 3 0 2 5 0 1 0 0 5 0 0 5 6 0 1 3 2 4 7 4 6 0 0 0 0 4 2 0 0 0 4 3 4 2 0 0 6 0 1 0 8 0 0 0 0 0 4 0 0 0 0 0 0 8 5 3 1 6 0 0 0 0 18 2 0 1 3 1 0 0 6 1 0 0 4 0 1 0 8 0 2 12 2 0 0 22 12 2 0 0 0 18 9 0 9 0 0 0 0 0 +denovo590 3 0 1 0 0 3 0 2 0 0 4 0 0 0 0 0 2 1 1 0 2 0 0 4 0 0 0 1 0 0 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 2 9 0 0 0 0 1 0 0 0 0 0 7 8 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 3 1 0 0 0 0 0 0 1 0 0 0 0 1 2 13 0 0 3 2 0 1 0 0 0 0 0 6 0 1 0 +denovo43 21 0 0 28 1 3 4 43 0 11 0 67 3 0 0 0 0 22 0 22 7 33 33 1 9 15 0 16 2 34 20 0 0 44 42 0 9 0 6 0 0 2 0 4 46 0 63 8 2 2 15 0 59 14 0 0 0 0 0 0 2 0 0 0 0 9 0 0 0 0 10 5 0 0 0 3 0 10 0 0 0 0 0 0 109 0 4 4 9 33 0 0 1 0 0 134 0 17 38 1 0 1 2 23 0 0 0 14 +denovo44 0 0 17 10 3 0 1 6 26 0 1 2 0 32 0 0 3 2 3 1 16 3 7 0 5 10 15 8 16 30 0 0 5 6 2 31 10 69 3 7 31 4 6 0 1 9 12 0 2 78 21 0 12 7 106 2 16 1 0 0 2 6 8 10 11 0 0 0 0 3 0 0 7 10 21 5 0 4 3 149 6 1 1 0 6 19 10 4 3 3 6 6 9 4 0 5 0 0 1 4 17 0 0 1 5 36 26 0 +denovo46 1 0 18 12 37 6 3 0 0 4 9 0 2 0 0 7 20 87 0 17 0 39 2 0 0 0 0 1 11 6 0 35 0 2 0 152 0 20 0 0 4 19 0 0 1 0 8 0 0 0 14 0 7 6 0 1 0 7 3 0 0 3 0 8 11 9 5 121 0 1 0 27 8 0 0 24 0 2 0 1 0 5 21 0 1 19 7 40 0 1 23 0 0 41 0 0 8 7 10 31 0 7 0 0 0 57 0 0 +denovo49 1 0 0 0 0 17 0 0 32 0 19 0 4 21 58 0 0 0 106 0 9 37 37 7 13 0 0 0 0 0 0 0 1 0 44 0 0 0 1 0 7 1 0 0 20 48 2 3 0 0 0 0 11 7 0 0 0 45 20 0 0 14 6 0 0 11 8 0 0 0 0 24 13 4 69 7 0 19 23 5 15 0 0 0 0 0 2 0 12 9 18 0 0 0 0 1 8 0 0 0 46 7 1 0 29 0 20 7 +denovo48 0 13 0 67 19 40 0 0 0 23 0 0 0 0 0 0 19 0 0 7 0 0 0 0 0 0 5 0 0 0 0 0 0 18 6 0 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 14 0 0 7 6 29 0 0 61 0 0 0 2 12 0 0 0 0 0 0 66 0 0 0 0 0 39 18 0 45 0 0 0 0 0 109 0 0 0 0 0 0 0 6 0 104 0 0 0 0 0 0 289 +denovo784 0 0 0 0 0 3 0 0 0 1 1 0 0 0 0 0 0 4 0 1 0 0 0 7 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 7 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 3 0 0 4 0 0 1 2 0 2 0 0 0 0 0 3 3 0 0 0 0 0 3 0 7 0 0 0 1 0 0 0 2 0 1 1 0 0 0 1 0 0 4 +denovo788 0 0 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 9 0 0 2 3 0 0 1 0 0 0 0 3 0 0 0 0 0 0 0 0 0 1 0 0 0 0 3 0 0 0 5 0 0 0 1 0 0 0 0 0 0 5 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 2 1 0 0 0 0 6 0 0 0 0 1 6 2 0 0 0 0 +denovo202 1 0 0 2 0 2 0 1 2 3 0 4 0 1 0 0 5 0 12 0 2 0 1 0 3 4 1 3 0 6 0 117 0 0 3 18 66 0 0 0 0 0 0 0 5 5 0 0 1 4 4 5 0 0 1 0 0 2 0 0 2 0 0 0 2 4 0 0 3 0 0 2 2 0 8 0 0 0 0 0 0 0 0 0 4 0 1 1 4 2 1 2 0 0 0 7 0 0 0 6 1 0 0 7 2 5 0 3 +denovo203 0 10 2 0 4 3 8 4 7 6 9 0 4 8 7 6 3 3 17 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 0 0 7 6 14 9 3 12 4 0 4 0 10 12 0 0 0 0 0 0 7 6 4 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 +denovo209 1 3 5 1 1 1 3 0 0 0 2 22 3 1 6 6 0 1 5 2 0 8 3 0 0 6 1 6 0 2 7 0 1 4 1 0 0 1 0 0 0 5 0 0 12 3 0 0 4 7 0 0 0 4 1 0 0 0 0 0 1 19 0 1 0 0 4 5 6 1 0 8 0 0 0 2 0 7 0 0 2 2 3 0 2 0 1 0 0 0 3 1 2 19 0 1 2 0 0 10 11 0 0 5 0 6 2 0 +denovo26 3 5 31 0 0 0 0 1 0 8 1 35 0 0 0 212 24 7 2 0 0 0 2 0 23 35 0 0 0 0 0 299 0 0 11 6 0 65 2 5 1 0 32 0 4 9 21 0 0 0 15 0 0 6 0 4 38 11 2 0 0 0 0 0 11 0 0 117 0 38 0 32 0 8 0 0 0 1 46 3 0 0 0 0 149 0 2 36 3 20 4 0 43 30 4 0 0 0 0 0 4 1 0 7 0 23 0 12 +denovo25 2 0 0 0 20 0 0 0 0 0 50 232 0 0 0 0 0 0 0 12 0 0 0 3 5 0 0 0 0 49 54 0 1 0 0 1 141 0 0 0 2 7 0 0 0 4 7 14 0 63 0 1 14 0 0 14 0 3 0 82 0 5 51 0 46 0 1 0 117 27 2 0 0 0 0 0 0 0 0 2 0 1 0 4 0 0 0 0 0 0 0 0 38 44 0 15 0 0 0 0 0 14 0 9 0 429 0 20 +denovo23 0 0 0 48 0 2 0 0 5 0 1 116 0 0 0 0 22 0 24 0 0 0 0 7 0 18 0 0 0 107 55 0 0 0 0 0 1 7 0 0 0 1 0 9 0 0 1 0 4 0 0 5 0 0 5 0 103 7 0 155 7 0 0 1 0 8 0 29 0 62 48 7 7 5 57 0 0 0 0 0 0 4 0 0 0 8 8 25 0 0 0 14 367 5 79 14 16 0 0 0 29 7 0 2 0 0 0 3 +denovo21 0 3 5 0 0 1 8 47 0 1 0 501 1 0 0 1 0 0 0 1 0 3 0 0 66 4 3 0 0 0 0 0 0 0 0 0 0 185 1 28 1 0 43 0 0 11 3 23 0 18 0 0 0 82 13 58 0 0 9 0 0 35 0 5 1 0 5 0 0 17 0 0 35 0 35 0 0 0 3 0 2 0 0 0 6 19 0 45 9 0 0 0 0 0 0 0 42 0 12 13 0 1 2 0 0 0 0 0 +denovo20 1 17 8 3 6 8 18 6 9 6 15 41 2 8 16 9 7 5 24 1 21 12 9 0 16 16 17 31 4 0 53 40 7 7 0 29 41 0 12 13 9 3 28 2 45 42 24 0 2 0 13 61 24 7 0 9 34 0 1 16 13 12 4 24 14 9 9 25 20 14 0 5 19 6 11 17 7 7 15 2 58 23 0 0 54 27 0 19 3 24 5 8 22 21 12 14 10 24 20 12 21 6 11 5 32 0 31 16 +denovo28 0 0 26 0 2 7 0 2 0 0 0 6 0 0 10 30 0 25 17 0 1 140 2 0 0 12 2 0 17 0 11 34 0 0 27 0 75 53 0 15 0 0 0 13 0 35 0 0 0 40 2 0 7 0 4 0 0 0 49 0 5 0 467 0 0 76 0 6 28 8 0 0 0 0 1 0 0 4 8 5 0 0 11 0 1 111 19 16 1 5 4 0 0 15 0 42 22 0 1 4 0 0 6 0 32 15 5 5 +denovo411 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 7 0 0 0 1 0 0 0 1 1 0 0 0 0 2 1 0 0 4 0 0 70 1 0 0 0 4 2 2 0 3 0 0 2 0 0 0 0 0 0 0 0 0 8 0 0 0 1 2 1 0 0 0 6 0 1 0 0 3 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 2 1 0 0 0 1 10 0 0 1 1 0 0 0 +denovo415 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 2 6 0 1 1 4 0 1 0 2 20 0 0 0 1 0 0 5 2 0 1 5 2 0 0 1 6 0 1 0 1 0 3 2 1 0 0 1 1 0 1 0 0 0 0 1 0 1 0 0 1 1 0 1 6 0 7 2 1 0 0 2 0 1 1 1 1 0 2 0 0 1 0 7 0 4 0 11 0 2 0 0 0 1 1 3 11 0 10 1 2 0 +denovo414 0 3 2 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 14 0 0 7 0 0 0 2 0 1 0 4 0 1 0 0 4 12 11 1 0 0 11 0 0 0 1 0 0 3 0 0 0 0 0 0 0 0 2 0 7 0 0 0 3 2 0 0 1 0 2 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 11 2 0 0 2 0 0 3 0 2 0 0 1 19 1 0 0 0 3 +denovo419 0 0 1 0 0 0 12 0 0 0 2 0 0 0 0 0 0 0 0 1 0 0 0 1 2 0 7 2 0 2 0 0 0 0 4 0 0 0 0 0 0 0 0 0 4 0 0 0 1 0 0 0 0 2 0 0 0 0 0 0 0 0 0 1 0 6 0 0 0 0 3 0 4 2 0 7 0 0 0 0 4 0 33 0 3 9 0 0 0 0 17 0 0 20 0 0 0 0 7 6 0 0 0 0 0 0 0 1 +denovo620 0 0 0 1 1 0 2 0 0 1 0 1 0 0 0 4 0 0 0 1 0 0 2 3 3 1 7 1 0 0 1 2 0 1 0 0 7 1 2 0 1 0 1 3 1 0 1 3 1 2 2 0 4 0 0 1 1 0 1 0 1 1 1 0 2 0 2 3 1 0 1 2 0 0 0 4 0 0 1 3 2 0 0 0 1 0 0 2 0 1 1 0 0 1 0 0 0 2 0 1 0 0 2 0 0 0 0 1 +denovo437 1 3 1 0 0 0 1 1 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 4 1 0 0 0 0 1 0 3 3 0 0 0 0 0 2 0 1 0 1 0 2 2 0 0 0 5 0 7 1 0 2 0 0 3 0 2 0 1 1 0 0 0 2 0 0 0 28 0 0 0 0 1 0 0 1 0 0 1 2 1 0 3 0 1 0 0 0 0 0 14 0 0 0 1 13 0 3 0 0 0 1 0 +denovo123 0 0 0 0 2 5 0 0 0 0 0 1 0 0 0 0 0 13 0 0 0 0 0 0 2 6 0 0 70 13 0 0 0 0 0 11 0 0 1 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 13 0 0 0 0 0 8 0 0 0 0 0 7 32 7 18 0 0 12 0 0 41 55 11 37 0 13 0 0 0 0 69 6 0 0 5 4 0 6 0 0 0 0 5 3 +denovo122 2 9 2 6 0 1 3 3 0 0 0 3 0 0 11 1 0 1 0 0 0 7 5 28 0 17 30 0 0 6 13 25 1 86 18 0 1 4 0 0 8 1 0 0 0 24 3 0 2 0 0 12 8 0 0 0 0 0 0 1 10 0 0 0 2 0 0 0 0 0 0 3 0 0 0 12 0 9 2 0 5 0 1 0 0 0 0 11 34 5 0 1 11 13 0 4 1 6 4 0 33 0 0 11 1 2 6 1 +denovo125 0 0 0 0 41 0 0 0 12 0 4 43 2 0 0 0 0 0 0 18 33 0 0 0 0 0 29 0 0 7 31 0 4 2 0 0 0 0 17 0 0 0 0 0 7 0 17 0 17 0 0 0 0 12 25 0 1 0 0 0 0 3 0 0 0 0 0 0 0 3 0 0 0 16 0 0 0 24 0 5 21 1 0 0 6 1 0 0 0 0 0 0 0 0 0 0 2 0 5 0 0 0 0 1 0 0 4 0 +denovo223 0 2 0 0 0 0 0 0 0 0 1 0 0 0 1 12 1 0 4 0 1 25 2 8 2 7 1 0 0 5 2 0 0 0 4 1 1 0 0 0 0 0 33 7 0 2 0 0 0 0 1 23 14 0 0 0 4 6 0 0 0 0 7 0 0 0 1 0 8 0 0 0 1 1 1 0 3 0 0 2 8 0 0 14 0 0 0 1 0 1 0 0 0 0 43 2 0 0 0 0 0 0 0 0 0 1 4 1 +denovo601 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 2 7 1 0 0 0 1 1 0 39 0 1 0 0 2 0 0 4 0 8 0 1 5 0 1 0 0 1 5 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 1 0 0 0 0 0 0 1 0 2 0 1 0 0 4 6 0 0 0 0 0 0 0 3 0 5 0 0 1 3 0 0 0 +denovo607 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 2 3 1 0 0 0 0 0 0 0 1 0 1 0 4 0 0 0 0 0 0 0 1 11 4 0 2 5 2 0 0 1 2 7 0 1 0 0 1 9 2 0 0 0 0 0 2 0 0 0 3 0 0 3 0 0 0 0 2 0 1 0 0 3 0 1 0 0 0 0 1 1 7 0 6 0 0 1 0 0 0 1 3 0 0 0 1 0 2 +denovo608 0 0 1 1 0 0 0 0 0 0 0 2 0 0 1 0 0 0 2 0 0 2 1 1 4 0 0 0 0 1 1 1 0 0 0 1 3 3 0 0 1 0 4 0 2 2 0 4 0 0 0 10 1 0 0 0 0 1 0 0 0 0 1 1 0 0 1 9 0 1 0 1 1 2 7 0 0 0 1 0 1 0 1 0 1 2 1 1 1 0 2 0 0 0 4 2 0 0 2 0 0 0 0 0 2 0 0 3 +denovo1090 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 13 0 0 0 0 0 2 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 5 0 0 1 2 0 2 0 0 0 0 1 4 0 2 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 2 0 0 0 1 0 0 0 0 1 0 0 +denovo667 0 7 0 0 0 0 2 0 0 1 0 1 0 1 0 1 0 2 0 1 1 0 0 1 0 2 0 6 4 0 0 0 1 0 2 0 0 0 2 0 2 0 0 0 3 1 1 0 3 0 0 0 0 1 2 0 0 1 0 0 0 0 0 2 1 0 2 0 1 1 4 0 2 3 0 0 0 0 2 1 3 0 0 0 0 0 0 0 0 0 3 0 0 0 0 2 0 2 0 4 19 0 0 0 0 0 0 0 +denovo472 0 0 8 0 0 0 0 0 0 0 6 0 0 3 0 10 1 0 0 0 0 0 0 0 1 0 0 0 0 0 4 0 0 0 0 0 0 0 0 1 0 0 0 2 0 0 0 0 1 1 0 0 0 3 5 0 3 11 0 0 0 1 0 0 1 0 0 2 25 0 3 0 0 5 0 0 0 0 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 3 14 0 0 +denovo399 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 4 0 1 0 0 4 0 0 0 0 0 0 0 1 0 0 0 0 52 5 4 1 0 2 0 0 0 0 0 2 0 0 3 0 0 0 0 0 0 1 1 0 21 0 0 0 0 0 0 0 0 0 1 0 2 0 0 0 0 5 0 2 0 14 1 0 0 3 0 0 3 0 0 6 0 2 0 0 0 0 1 5 0 +denovo139 2 0 2 28 7 0 0 0 0 3 2 1 0 0 5 24 6 5 0 0 17 3 0 1 0 2 3 8 11 2 0 3 3 0 0 0 0 0 1 0 5 13 0 0 1 0 0 0 3 0 4 0 2 1 5 0 4 0 0 0 2 9 0 1 3 0 0 19 75 0 0 0 0 0 0 10 0 0 2 0 0 0 0 0 0 0 2 0 9 1 0 0 0 0 0 0 0 0 0 1 41 0 41 1 36 4 8 1 +denovo132 9 1 0 3 5 6 4 0 6 1 2 3 1 4 2 19 0 1 0 0 9 6 10 3 1 0 0 3 0 7 16 4 2 0 0 0 0 0 2 0 13 17 0 0 14 13 6 1 11 1 2 0 1 13 9 2 2 0 0 5 2 0 0 1 5 3 0 18 0 2 0 13 33 0 1 6 3 0 0 1 5 5 0 0 1 10 1 3 1 0 5 5 0 0 0 7 4 0 0 5 2 0 3 3 0 9 0 7 +denovo136 20 0 0 0 0 2 6 4 1 5 9 5 2 1 0 0 1 0 7 0 0 1 0 0 15 6 0 2 0 0 11 4 0 0 3 0 0 1 1 9 12 0 4 0 18 2 0 0 2 0 7 0 3 0 0 26 5 0 7 0 1 3 0 3 0 2 0 49 21 4 10 0 4 0 13 4 3 1 4 24 2 3 49 0 0 4 4 14 11 0 0 0 0 0 12 0 0 0 0 0 9 1 0 0 2 0 4 1 +denovo137 0 0 0 0 1 0 0 7 0 0 6 0 1 0 0 0 0 1 0 1 0 13 0 5 0 11 45 0 0 0 6 0 61 0 0 0 0 0 11 0 0 22 0 0 2 0 0 8 2 0 1 0 0 41 0 0 0 0 0 20 0 0 0 0 0 0 30 0 0 0 4 5 0 4 0 6 0 2 1 12 0 8 0 0 0 0 1 0 0 16 0 0 3 9 0 0 0 58 2 21 0 1 20 5 0 0 4 0 +denovo641 0 0 0 0 0 3 1 0 0 2 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 10 0 5 0 0 0 0 2 0 0 0 0 0 0 0 0 0 6 0 9 3 0 0 0 0 1 0 0 0 0 0 1 0 2 0 0 0 0 0 0 19 0 0 0 0 0 0 1 2 0 0 0 0 1 2 6 3 0 2 0 1 0 0 2 3 0 0 0 0 1 3 0 0 0 0 0 0 3 0 0 0 0 1 +denovo112 0 0 58 2 3 0 0 0 4 0 0 0 20 32 0 0 0 0 0 3 0 0 0 0 0 0 2 2 8 0 18 0 0 7 3 0 0 0 78 1 0 0 0 0 0 209 0 0 0 0 2 2 0 0 12 0 0 0 0 0 0 2 0 0 0 0 0 0 29 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 3 0 7 0 0 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 +denovo115 0 5 10 37 0 3 0 3 29 4 4 20 0 0 15 0 0 0 0 13 0 3 7 0 0 0 0 7 0 66 0 0 4 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 2 13 0 0 0 50 0 0 0 0 0 0 14 0 0 4 0 6 0 0 0 0 22 0 0 0 0 0 0 0 1 2 0 3 0 0 0 7 0 13 5 2 1 0 2 2 0 0 0 1 1 28 0 0 0 43 0 31 6 +denovo116 0 0 0 0 0 0 24 1 0 0 0 0 9 1 0 0 0 0 0 9 6 0 0 9 4 0 0 3 0 0 0 0 3 0 0 0 0 0 17 0 0 23 0 0 0 0 0 0 2 0 0 0 0 6 0 18 0 0 0 0 5 0 0 0 0 0 45 0 0 0 7 0 10 8 0 15 0 0 22 0 0 0 0 0 8 0 0 0 0 62 0 0 0 0 0 15 11 22 0 0 0 1 0 93 0 0 0 13 +denovo118 44 0 115 43 3 8 0 8 0 0 0 0 0 7 0 0 0 1 1 0 0 2 0 0 0 0 0 0 0 0 0 0 0 14 0 0 0 5 3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 1 0 0 0 0 0 100 0 4 11 0 5 0 0 0 3 0 66 39 0 0 0 0 0 1 0 0 0 7 0 0 0 0 0 0 0 0 0 0 0 1 0 0 4 0 0 0 44 0 0 +denovo88 4 130 1 0 0 1 8 0 0 3 0 1 0 2 0 6 0 0 4 0 0 0 0 0 0 0 0 0 0 0 17 0 3 0 0 0 7 0 0 102 1 12 0 0 0 1 0 0 0 0 0 0 5 0 0 0 0 0 0 8 0 0 0 0 0 0 2 0 0 6 0 0 1 0 0 0 0 0 0 7 0 0 0 0 1 0 0 0 0 0 2 1 14 0 9 0 0 0 62 0 0 0 0 0 0 9 0 1 +denovo1114 0 0 0 0 0 2 0 0 6 0 0 0 0 0 1 0 2 0 0 0 0 3 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 3 1 0 0 0 0 0 0 0 0 0 0 0 3 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 2 0 0 0 0 0 1 0 2 0 2 0 0 1 1 0 2 0 1 0 0 2 0 1 0 0 0 0 1 0 0 0 0 0 0 1 +denovo560 0 0 0 0 1 0 0 0 0 0 0 0 1 2 1 0 2 0 0 2 1 0 1 0 0 1 10 0 8 0 0 0 0 1 0 0 0 23 0 11 1 0 0 0 0 0 2 0 0 0 1 0 3 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 4 0 0 0 0 0 0 0 0 0 7 0 0 2 0 2 0 3 5 0 0 0 0 2 0 0 0 0 0 0 0 2 0 6 0 +denovo567 2 0 0 2 0 0 0 0 0 0 1 2 1 0 0 0 0 0 0 0 0 3 0 5 0 0 0 0 2 0 0 2 1 0 0 0 0 0 0 1 0 0 1 0 2 3 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 4 0 0 1 0 0 0 0 1 0 2 5 9 1 0 0 0 7 1 6 0 0 2 0 0 0 4 0 0 0 0 4 0 0 8 2 1 4 0 7 1 0 0 0 0 0 1 +denovo4 42 109 32 0 11 36 49 5 33 2 28 59 3 0 29 0 5 3 92 2 0 120 2 9 6 11 0 10 28 106 144 0 97 97 139 174 0 83 2 21 0 12 7 4 29 344 2 2 5 62 37 1 242 6 0 2 43 4 10 0 16 11 6 148 11 40 0 0 0 41 18 37 6 40 12 95 337 11 0 4 97 104 17 0 511 0 1 13 5 19 2 49 18 58 302 43 54 15 104 8 0 14 26 19 43 56 19 19 +denovo351 0 0 0 5 6 0 0 0 0 0 2 0 4 3 0 0 0 0 0 0 2 0 0 8 0 0 0 13 10 9 0 0 0 0 0 0 14 0 1 6 0 2 0 0 5 5 2 0 0 0 0 0 0 0 27 0 0 0 2 0 1 0 0 3 0 0 0 0 0 0 0 1 0 0 8 0 0 0 1 0 2 7 0 0 14 0 5 0 2 0 0 0 0 0 0 0 0 1 0 3 0 0 0 0 0 7 0 1 +denovo357 0 0 1 0 0 0 0 3 0 0 0 13 0 0 0 0 1 1 0 0 1 10 0 0 7 0 3 0 1 0 0 0 3 0 2 3 0 2 0 2 1 0 2 1 0 4 0 0 1 0 3 17 0 0 2 1 0 0 0 0 0 1 2 0 0 0 0 78 1 0 1 0 0 0 0 0 0 0 0 3 5 2 0 0 1 2 1 0 2 5 0 1 0 0 0 0 2 1 1 0 0 0 0 0 3 4 0 0 +denovo177 0 3 0 0 3 0 0 0 0 0 0 81 1 9 0 0 0 38 0 8 0 0 2 0 5 11 25 9 0 82 0 0 0 11 0 0 0 0 11 0 0 0 0 0 0 1 3 2 21 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 7 0 0 0 0 0 0 5 0 0 0 0 0 0 0 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 2 0 0 0 0 0 0 0 +denovo179 0 0 0 2 1 0 1 1 0 5 2 1 0 1 0 0 17 0 4 0 0 0 0 0 2 1 0 5 0 5 0 47 1 0 0 67 98 0 1 0 0 1 0 0 10 18 1 0 0 6 0 22 0 0 2 0 0 0 0 1 2 0 0 1 0 2 1 0 10 0 0 1 0 1 12 0 0 0 0 0 0 0 1 0 2 3 2 0 8 9 0 0 0 1 0 1 0 0 0 4 0 0 0 1 0 11 0 0 +denovo519 0 0 4 12 1 5 0 1 2 1 0 0 0 4 0 0 6 0 0 0 0 0 9 0 0 0 2 0 0 2 0 0 0 0 1 0 7 4 1 1 1 0 0 0 1 0 2 0 0 0 1 0 3 0 19 0 1 0 1 2 0 2 0 0 0 0 0 0 0 1 1 2 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 1 0 0 1 0 0 3 1 0 0 0 2 0 0 +denovo515 0 0 2 0 0 1 0 1 0 0 5 0 0 0 0 0 1 2 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 3 0 0 0 0 0 0 0 2 0 0 0 0 2 3 0 0 0 0 22 1 0 0 0 0 6 4 0 4 0 0 0 0 0 0 0 0 0 1 0 2 0 4 0 3 2 1 0 0 0 0 0 0 0 0 0 0 1 5 8 0 0 1 3 0 0 1 0 0 2 0 5 0 3 0 +denovo540 0 0 11 0 1 0 0 3 0 3 0 0 0 0 0 0 0 0 0 0 3 0 3 15 0 0 7 1 0 0 0 0 0 0 0 0 1 0 0 0 2 0 3 0 0 0 0 0 10 0 0 0 0 1 0 0 0 0 0 3 0 0 0 0 2 0 0 0 0 0 0 0 0 3 0 1 0 0 0 2 0 0 1 0 0 0 0 12 1 0 0 5 0 0 0 2 0 0 0 4 0 0 0 0 1 0 13 3 +denovo370 0 0 0 0 0 3 1 0 0 5 0 0 0 1 0 1 0 0 0 0 6 0 0 0 0 0 0 2 0 7 0 83 0 0 2 0 1 0 3 0 0 0 0 0 6 5 0 0 0 1 3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 5 1 0 5 2 0 15 0 0 1 0 0 0 0 0 0 4 0 1 0 0 0 0 0 0 1 0 6 0 0 0 1 1 0 0 6 0 2 0 1 +denovo371 0 0 0 0 1 1 4 0 0 0 0 0 0 1 0 0 0 2 0 1 0 3 0 4 4 2 6 1 6 3 0 4 0 0 5 0 1 0 0 7 7 3 4 12 0 3 0 0 2 4 1 0 0 0 5 3 0 0 1 0 0 2 0 1 1 2 3 0 1 0 3 4 0 4 2 3 1 0 0 0 3 4 0 0 9 2 0 6 0 2 0 0 3 5 0 0 1 0 0 4 2 0 2 0 1 1 3 0 +denovo155 0 0 0 1 0 0 0 4 0 0 0 0 5 0 2 0 0 8 5 0 1 1 0 2 0 1 0 0 1 0 1 0 3 0 0 1 9 1 0 0 0 2 0 0 10 0 2 0 0 1 2 7 11 0 1 0 0 3 0 44 0 7 5 2 1 0 0 26 0 1 0 1 1 1 3 0 0 0 0 16 0 2 5 16 3 0 0 0 7 3 0 1 1 1 0 152 0 0 0 0 4 7 2 1 0 1 1 1 +denovo152 5 6 5 0 0 0 0 7 0 10 0 0 4 0 0 0 0 1 0 1 0 1 4 0 0 0 0 3 59 0 10 0 0 0 7 7 0 0 27 0 34 0 0 0 0 0 0 0 6 1 0 0 0 2 0 0 64 0 0 0 10 12 0 0 0 0 0 0 0 2 0 0 0 56 0 0 0 0 11 1 0 15 0 0 2 0 3 0 15 0 2 2 0 3 0 0 0 0 0 0 0 0 0 0 0 8 0 22 +denovo1159 0 0 0 0 1 0 0 0 0 0 0 2 0 0 1 0 0 0 0 1 0 3 2 0 1 0 0 0 2 0 2 1 0 0 0 0 1 0 0 2 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 2 0 0 1 0 0 1 0 0 0 0 0 1 0 1 1 1 2 0 0 0 0 0 0 2 0 0 0 2 1 0 0 0 1 0 0 0 +denovo525 0 0 1 0 0 0 6 0 0 0 0 6 0 1 0 5 2 3 0 0 0 1 2 0 0 5 0 4 2 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 8 0 0 0 0 0 1 0 2 0 7 3 4 0 4 1 0 3 8 7 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 2 0 0 0 2 0 0 0 0 13 0 0 0 0 0 0 0 0 2 0 0 0 6 1 +denovo314 7 0 0 1 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 1 39 0 0 0 0 2 0 0 23 0 0 0 0 5 0 5 1 0 0 0 1 0 0 9 0 0 0 0 0 0 9 0 0 0 0 2 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 3 0 21 5 2 0 0 0 0 0 0 10 0 2 0 16 0 0 0 1 0 0 21 0 0 0 10 0 14 0 +denovo311 0 2 12 0 1 0 1 1 2 0 1 0 0 0 0 9 15 1 0 2 3 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 2 0 1 0 0 0 0 0 2 0 0 2 0 0 0 3 0 0 0 0 0 0 2 0 0 2 0 0 0 0 4 0 0 1 6 0 0 0 1 0 0 0 1 2 0 0 0 0 23 0 0 0 0 0 1 0 0 0 0 0 0 7 0 0 0 0 0 0 0 +denovo509 2 0 0 0 0 0 0 3 0 1 0 0 0 1 0 4 0 0 0 0 0 0 0 0 0 0 6 0 2 6 0 0 0 1 8 0 1 7 0 0 8 0 0 0 3 0 3 1 0 0 1 0 1 1 1 0 8 0 0 2 0 1 0 4 0 0 0 0 0 0 2 0 0 2 1 3 0 6 0 1 0 2 1 0 0 1 1 4 0 1 3 0 0 0 0 3 0 0 0 1 0 0 0 0 0 0 0 3 +denovo508 0 3 0 1 4 1 0 0 1 0 0 6 1 3 0 3 1 0 2 1 1 2 1 2 3 0 1 2 0 5 3 4 0 0 0 7 2 0 0 0 0 0 0 0 3 1 11 0 1 1 2 0 1 1 6 0 0 0 0 0 4 0 0 1 0 1 1 0 0 1 0 0 1 1 3 1 0 0 0 0 0 0 1 6 0 2 1 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 2 1 0 0 +denovo502 2 0 0 0 2 1 0 0 0 1 1 1 0 0 0 0 4 2 0 1 3 0 1 0 1 0 6 1 0 1 0 0 0 7 0 0 4 6 0 0 1 13 1 1 1 0 0 0 1 1 0 0 1 1 2 0 1 0 0 1 0 1 2 1 0 1 0 2 0 2 4 2 12 1 0 1 0 0 0 1 0 3 0 0 1 1 0 0 0 6 2 0 1 5 0 1 1 1 1 1 0 1 5 0 3 0 2 0 +denovo507 0 0 1 1 0 2 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 2 0 2 0 0 10 0 0 0 8 1 0 0 11 3 0 1 0 0 4 0 1 0 0 3 3 6 0 4 1 0 1 0 0 0 0 0 1 0 0 0 0 4 1 1 2 1 2 0 0 1 0 0 0 3 0 0 0 0 0 0 0 0 0 1 0 0 0 5 0 0 1 1 0 0 0 2 0 1 0 0 1 0 0 0 31 0 +denovo506 5 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 1 1 1 0 0 0 0 0 5 10 1 0 3 2 2 0 1 7 0 0 0 0 0 0 0 0 0 0 1 0 0 2 16 1 0 9 0 3 3 0 0 2 0 0 0 6 1 0 26 0 2 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 5 2 1 0 0 +denovo505 0 0 0 0 0 0 6 6 0 3 0 0 0 2 0 0 0 0 0 0 0 0 5 8 6 0 0 7 0 0 0 0 0 0 0 0 2 0 6 0 0 0 0 0 0 2 0 0 0 3 0 0 0 0 1 1 0 0 0 0 0 3 0 0 6 0 0 0 0 0 0 0 16 0 2 2 0 0 0 2 0 5 1 0 0 0 0 0 0 0 3 0 0 0 0 9 0 0 0 1 3 0 0 0 0 0 8 0 +denovo334 0 0 2 0 0 0 1 0 0 0 0 7 0 0 3 1 3 0 0 0 0 5 1 0 9 0 0 0 1 1 4 0 0 0 0 0 0 8 1 0 2 1 12 3 2 3 0 1 0 1 0 15 2 2 1 1 5 1 0 0 2 1 0 1 1 1 0 24 0 0 1 0 0 0 5 0 1 0 0 0 8 0 0 20 0 1 1 0 6 2 0 1 0 1 0 10 0 2 0 2 1 0 1 0 7 1 0 2 +denovo331 0 4 0 0 1 0 0 0 8 1 0 1 3 3 0 11 11 0 0 0 0 1 1 2 1 0 3 0 27 1 5 0 5 0 1 0 0 29 0 0 14 0 0 0 2 0 0 0 4 1 2 0 0 0 17 1 0 0 0 0 0 2 0 3 0 0 0 0 0 0 0 0 0 1 0 2 0 0 1 0 11 4 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0 0 2 1 1 0 0 0 0 0 3 0 +denovo198 8 6 0 2 14 0 0 11 0 0 0 11 0 20 0 0 0 0 0 7 0 0 0 0 0 0 6 0 0 8 0 0 3 1 0 0 0 0 46 27 0 4 0 0 0 0 2 10 0 23 0 0 12 0 0 0 0 0 0 0 0 4 0 5 7 0 0 0 0 0 1 0 0 0 0 3 0 0 2 14 0 3 0 0 2 2 0 6 13 0 0 0 10 0 0 22 0 0 2 12 5 0 0 0 0 0 0 2 +denovo190 0 2 0 0 0 0 0 2 0 0 0 17 0 0 4 12 3 0 8 0 4 10 0 0 7 0 2 1 2 3 0 2 0 3 0 0 0 0 0 3 0 0 5 0 5 0 2 0 0 0 0 15 4 2 0 0 0 2 0 0 0 2 3 5 0 0 1 32 0 5 0 0 1 2 1 0 0 1 0 1 3 5 2 77 0 0 3 30 0 0 10 1 1 0 3 3 3 0 1 0 0 1 6 1 0 2 0 1 +denovo193 15 0 2 0 0 0 0 0 5 0 0 40 0 0 0 0 0 0 1 0 0 0 6 1 0 0 0 0 18 0 0 0 11 9 0 0 0 0 15 79 0 0 0 0 12 0 15 0 2 0 0 0 0 0 4 2 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 11 22 0 6 0 0 0 0 0 4 0 0 0 0 1 5 0 7 0 3 0 12 20 0 0 0 5 0 0 0 0 31 3 0 0 0 +denovo293 3 0 0 0 0 1 0 0 0 0 5 5 0 0 0 0 1 0 0 0 0 0 7 0 0 0 1 17 0 6 1 0 4 0 0 0 4 0 11 0 0 0 0 0 0 0 0 0 4 0 0 0 1 12 0 0 0 0 3 5 2 9 28 0 13 1 0 0 0 0 0 0 0 0 3 0 0 39 0 0 0 0 0 0 18 0 0 0 10 1 1 0 3 0 1 0 0 2 0 0 0 2 0 5 0 0 0 0 +denovo291 0 0 0 1 0 0 0 0 0 0 0 0 0 5 3 0 0 0 11 0 0 0 1 0 0 2 0 0 0 12 0 0 1 2 0 0 2 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0 0 13 0 0 0 0 1 1 3 1 0 0 2 4 0 0 0 4 0 2 0 0 3 0 3 3 0 0 0 16 4 0 8 25 2 4 3 0 0 0 9 35 0 8 4 2 0 0 0 0 0 0 0 0 0 0 +denovo297 3 0 0 3 2 2 2 2 2 0 0 2 1 13 0 1 4 3 0 0 0 0 0 8 0 8 0 1 8 1 0 6 0 4 0 0 0 0 10 27 5 0 6 8 2 3 1 2 1 1 2 0 0 0 3 0 8 0 0 5 0 1 0 0 0 3 3 0 0 0 0 1 6 1 0 7 0 1 5 0 2 1 0 0 0 0 0 0 6 4 5 0 1 5 0 0 0 0 0 2 3 0 0 0 7 0 0 1 +denovo718 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 5 0 1 4 0 2 0 1 0 0 0 1 0 10 0 2 0 1 4 2 3 0 4 0 0 2 0 1 1 0 0 0 1 2 1 0 0 0 2 0 1 0 0 0 1 0 0 0 0 0 0 2 1 1 0 0 0 1 0 0 0 1 0 3 0 0 7 0 4 0 0 0 3 0 0 0 0 0 1 3 0 0 0 1 0 0 1 +denovo711 0 0 1 0 0 0 0 0 2 0 0 0 0 0 0 0 7 0 0 0 2 0 0 0 2 3 0 0 0 0 6 1 0 0 0 10 10 0 7 0 3 0 3 0 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 1 0 0 0 0 0 11 0 0 4 0 0 0 0 0 0 2 2 0 0 0 0 0 2 1 0 2 0 0 0 0 0 0 0 1 0 2 0 0 0 4 0 0 +denovo716 0 0 0 1 0 0 2 1 0 0 0 0 0 1 0 3 0 0 0 0 0 3 0 1 0 0 6 0 3 4 2 0 0 5 0 0 1 4 0 3 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 3 1 0 0 1 0 0 12 0 0 0 0 1 2 0 0 1 0 0 0 0 0 0 5 0 1 0 0 0 0 1 0 8 0 0 0 0 0 0 0 +denovo715 0 0 1 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 3 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0 3 2 3 0 0 2 0 1 0 0 0 0 0 0 0 0 11 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 3 0 0 2 2 0 2 0 0 0 3 2 0 0 1 0 1 0 1 2 0 0 0 3 0 1 +denovo845 0 1 1 1 0 5 1 0 1 3 2 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 0 0 0 3 0 0 0 0 2 0 0 2 2 0 1 0 0 0 2 0 2 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 2 0 0 1 1 0 0 0 0 0 1 0 2 0 0 1 0 0 2 0 2 0 0 0 0 2 1 0 0 0 0 0 0 0 1 2 0 0 0 +denovo849 1 1 1 0 1 1 0 0 0 5 1 0 1 0 0 0 1 0 4 0 0 0 1 1 0 0 1 3 0 2 0 0 0 0 0 0 0 0 0 1 0 0 0 0 5 1 1 0 1 0 1 0 0 2 3 0 0 0 0 0 0 0 0 0 1 0 0 0 8 1 1 0 0 2 0 1 0 0 0 0 0 0 1 0 0 0 1 1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 +denovo272 1 0 3 0 1 0 3 4 2 0 1 2 0 0 4 7 2 0 0 1 0 0 1 0 4 2 0 8 0 1 5 2 0 4 7 2 0 6 0 0 1 5 2 35 3 3 3 6 3 4 0 11 0 2 3 0 2 0 0 0 1 3 0 4 1 1 1 0 0 0 2 5 7 0 0 1 0 1 1 0 9 0 2 0 1 5 0 0 2 1 0 0 0 2 0 0 2 0 3 2 1 0 0 3 3 3 3 2 +denovo276 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 4 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 2 0 1 0 0 1 0 1 0 9 0 0 2 4 0 0 0 0 0 1 0 0 1 9 0 0 0 0 0 0 4 0 1 1 1 96 0 0 0 0 1 0 0 0 0 0 0 0 0 2 3 0 0 1 0 1 3 3 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 +denovo278 1 0 0 0 5 2 1 0 0 2 0 0 0 0 0 0 0 0 0 0 0 1 5 0 0 0 0 1 0 4 2 0 0 0 0 0 0 0 11 1 0 2 0 0 12 2 8 0 1 6 0 0 4 0 4 0 0 5 0 1 3 0 1 5 6 2 5 6 0 0 0 0 0 0 4 4 0 0 10 0 8 0 1 0 0 0 0 1 0 10 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 9 +denovo731 0 0 0 0 0 0 2 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 2 0 1 1 10 0 0 2 0 0 0 0 11 0 0 0 0 0 0 0 2 0 0 1 0 0 1 4 0 2 3 1 0 1 0 3 0 2 0 2 1 1 0 0 6 0 0 0 0 2 2 0 1 0 1 1 0 0 0 2 0 0 0 3 0 9 0 0 1 0 1 0 0 0 0 0 0 0 +denovo736 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 2 0 0 0 0 2 0 0 0 0 7 0 0 1 0 0 4 1 0 0 0 5 0 0 6 0 5 0 0 0 0 0 0 0 3 4 0 0 0 0 2 0 0 0 0 1 0 0 0 1 0 3 2 0 0 0 0 0 0 0 3 0 1 2 0 6 0 0 0 1 1 0 3 0 2 0 0 0 0 0 11 0 0 0 0 0 3 0 0 1 0 0 +denovo866 0 0 0 1 0 0 1 0 1 2 0 4 0 0 0 0 0 0 0 3 1 0 0 0 0 1 0 0 0 0 2 1 2 0 0 0 0 4 0 0 0 1 0 0 0 0 0 0 0 0 2 0 0 2 0 2 0 0 0 2 0 0 1 1 0 0 0 0 2 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 4 2 1 0 4 0 0 0 1 0 1 1 2 3 1 5 0 3 0 +denovo1 131 200 0 0 180 94 48 8 0 93 85 1 15 0 204 316 180 0 27 12 294 0 82 12 515 91 0 39 0 300 162 114 0 0 12 634 301 0 155 50 211 115 293 33 94 735 51 67 22 320 0 260 347 90 0 120 554 110 218 23 169 17 15 0 42 56 137 0 69 18 43 61 117 178 0 0 85 123 78 1 248 17 4 7 235 0 13 187 152 241 44 116 20 416 462 56 205 20 22 42 210 36 0 487 0 249 4 25 +denovo3 41 23 15 10 4 32 146 79 80 1 12 45 17 14 0 23 0 44 0 28 0 112 46 17 16 248 76 41 68 3 42 1 88 27 80 0 0 49 130 151 7 13 0 19 129 0 20 25 25 97 262 0 2 105 5 38 0 159 52 111 30 0 0 41 12 111 53 0 2 45 131 56 88 238 0 7 0 3 85 8 0 49 31 0 149 59 27 1 20 147 10 30 47 68 0 20 229 113 75 95 0 336 108 113 25 0 45 94 +denovo5 31 45 116 17 25 7 49 0 0 1 35 8 0 11 41 28 19 160 3 2 20 0 15 18 6 4 4 11 67 18 28 11 4 36 6 0 2 39 10 47 101 8 40 14 8 2 16 2 18 21 56 0 5 5 147 3 48 16 1 27 11 67 11 26 46 3 10 0 0 13 0 107 11 252 9 60 5 2 30 7 22 14 19 0 38 113 1 67 24 35 15 45 24 3 16 156 162 4 143 31 0 2 0 18 17 0 99 0 +denovo6 7 18 16 368 126 13 6 20 3 0 0 6 4 59 0 2 86 2 0 245 2 3 176 37 177 12 1 24 26 6 50 23 0 3 10 1 11 58 15 16 2 0 2 0 14 92 54 28 8 5 16 5 13 51 131 57 0 1 1 0 4 29 0 0 50 46 34 72 26 27 5 71 14 73 3 58 8 37 3 0 46 22 49 0 3 40 19 20 37 3 8 8 0 20 0 2 21 1 110 9 9 3 0 2 2 93 2 16 +denovo8 0 0 204 0 0 0 0 7 18 0 0 28 0 0 0 0 0 42 292 7 63 1 8 112 0 0 0 0 189 0 37 53 0 9 206 0 0 0 21 0 0 7 0 0 0 0 3 0 7 0 153 7 136 132 28 0 0 0 0 67 0 0 0 0 0 0 0 0 0 0 0 0 9 0 525 56 0 0 2 0 0 201 0 29 0 0 0 0 2 0 0 0 0 0 0 0 48 51 0 0 0 1 0 0 0 0 0 0 +denovo9 41 274 0 0 162 24 32 8 1 54 36 0 34 0 197 79 138 0 36 0 172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 124 0 99 181 29 140 9 9 0 38 0 83 0 41 23 0 0 0 0 0 0 71 158 66 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +denovo256 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 41 0 0 4 0 0 6 0 0 0 0 45 0 0 0 0 4 2 5 0 3 0 5 0 5 9 7 0 0 18 0 0 0 0 0 0 0 41 0 0 0 0 0 0 3 0 0 0 7 0 2 0 0 0 1 0 0 3 0 0 0 0 0 0 1 0 0 0 0 1 14 0 1 0 27 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +denovo252 0 0 5 13 2 0 11 0 1 3 0 0 0 0 0 0 0 0 7 0 0 0 0 0 3 5 0 1 1 4 21 0 1 0 0 0 18 1 2 2 1 2 7 2 0 1 0 0 1 0 4 0 0 0 0 0 0 0 0 0 0 0 0 1 3 0 0 15 0 4 0 0 1 0 0 0 0 0 0 0 0 14 0 6 24 6 0 5 0 0 0 9 0 0 39 0 3 0 0 6 2 2 0 2 0 0 0 1 +denovo259 0 0 0 0 1 4 3 0 0 0 0 7 0 3 2 0 2 0 2 3 0 5 2 0 6 2 1 0 0 2 13 6 1 1 10 0 6 0 1 3 0 0 0 0 0 3 10 0 7 0 8 9 6 2 7 0 15 0 0 0 0 4 0 2 2 0 0 0 0 0 5 1 0 0 1 1 0 1 0 0 18 6 0 0 11 0 1 0 4 0 0 0 1 5 4 0 12 0 1 0 18 1 1 0 0 13 6 0 +denovo79 8 0 0 0 0 2 0 0 0 0 0 0 0 7 0 0 9 8 21 22 0 6 0 0 0 2 9 2 0 8 0 0 16 26 10 0 0 0 0 0 0 0 0 0 0 0 2 1 2 4 18 0 0 0 0 0 7 0 1 0 16 21 0 0 0 0 0 0 2 0 14 1 126 10 0 0 0 0 0 42 0 0 0 0 0 0 0 0 23 0 36 0 2 0 0 126 4 0 0 0 0 0 0 0 49 0 0 0 +denovo73 0 0 5 14 9 1 0 0 0 0 0 0 1 88 2 1 5 0 0 0 96 0 2 2 3 0 0 5 3 22 2 0 0 1 1 44 9 10 6 0 0 0 0 0 4 30 0 0 0 0 1 62 0 2 79 0 0 0 2 1 0 1 0 0 7 0 0 1 60 2 0 0 0 0 0 0 0 0 1 3 0 3 1 0 0 0 1 0 3 0 0 0 0 0 0 0 0 0 4 0 3 0 0 2 0 44 0 0 +denovo77 2 2 41 0 0 0 0 7 2 0 0 67 0 0 0 0 15 0 0 0 0 35 0 0 0 33 0 0 6 0 0 22 1 3 0 74 0 19 0 7 0 0 0 0 0 0 0 3 23 0 2 0 0 0 5 0 0 0 8 0 0 0 0 3 0 0 3 0 0 0 48 17 0 19 0 0 0 0 0 0 19 0 0 0 7 0 0 26 0 0 29 24 16 0 0 0 0 8 0 0 20 0 0 0 26 0 1 16 +denovo756 0 0 0 0 0 0 4 0 0 0 0 0 5 0 0 0 0 0 0 1 2 0 2 0 1 9 0 2 0 2 0 0 0 0 1 0 0 0 3 0 0 0 0 0 1 0 2 0 4 0 0 0 0 2 0 1 0 0 2 0 0 0 0 0 0 1 2 0 0 0 1 0 0 2 0 2 0 0 0 0 7 0 0 0 1 2 0 0 0 0 0 1 0 4 0 0 0 0 0 0 3 0 0 1 0 0 3 2 +denovo804 0 1 0 1 0 0 1 0 2 1 0 1 0 0 0 0 0 10 0 0 4 3 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 3 0 0 1 0 0 0 0 0 0 0 2 4 2 0 0 0 0 0 1 0 0 0 0 0 0 3 0 8 0 0 0 2 0 0 0 0 0 0 0 7 0 2 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 +denovo805 0 0 2 3 0 2 0 0 0 0 0 0 0 0 0 0 1 0 0 0 3 0 2 1 0 0 0 2 0 6 0 4 0 0 4 1 4 0 2 0 1 0 0 0 6 1 1 0 0 0 0 0 0 0 4 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 7 1 0 1 0 0 0 0 0 0 0 3 0 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 +denovo239 6 0 0 0 4 0 2 2 0 0 3 0 0 3 0 0 1 0 0 2 3 12 3 1 0 0 6 4 10 8 0 0 0 0 2 0 2 13 5 4 0 0 0 0 2 0 4 1 1 0 0 0 0 1 1 0 1 0 0 1 0 2 0 0 2 2 3 0 0 0 0 0 0 0 0 1 0 4 1 2 14 2 5 0 0 8 2 0 3 0 1 1 1 7 0 0 0 0 0 0 0 0 0 0 0 2 33 2 +denovo235 0 4 0 0 0 0 0 0 4 1 0 0 1 1 0 2 19 1 0 0 1 9 3 4 36 0 0 3 0 3 0 0 0 0 0 0 3 0 2 0 4 2 0 0 0 0 0 0 7 2 0 0 0 1 1 0 0 22 0 3 0 3 0 0 7 0 0 0 1 0 0 0 0 0 0 0 0 5 0 0 0 0 0 5 1 0 0 0 27 2 0 5 1 0 0 0 0 1 0 1 19 0 1 0 5 0 1 1 +denovo16 5 13 4 303 219 2 7 15 0 1 1 3 1 1 0 1 3 1 0 1 0 0 131 36 139 0 0 10 0 0 1 1 0 7 8 0 0 0 12 14 0 0 0 0 3 18 42 16 3 2 9 0 1 14 3 54 0 0 77 1 6 6 0 1 3 131 9 0 0 50 1 21 3 12 1 51 0 18 0 0 32 17 39 0 3 8 12 1 4 1 5 1 0 55 0 0 4 0 0 8 8 2 0 0 0 2 2 0 +denovo58 0 0 0 0 0 0 2 3 0 0 0 11 0 0 2 0 0 35 0 0 0 0 0 0 0 48 0 0 9 0 0 0 0 0 5 0 0 0 0 0 3 0 0 316 0 0 0 45 0 0 0 1 6 0 0 0 0 0 54 0 2 46 0 2 0 0 69 1 0 0 0 0 1 0 0 3 0 1 1 0 0 0 0 1 0 0 0 0 0 0 6 0 0 0 1 0 0 0 0 0 4 1 43 0 0 1 0 0 +denovo54 0 0 0 0 0 0 0 0 0 0 22 4 2 0 0 0 0 17 0 2 0 53 5 5 0 0 1 15 0 10 0 0 116 3 27 0 0 0 0 122 0 1 0 0 0 0 24 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0 159 0 0 0 0 3 0 0 0 13 0 32 0 0 0 0 41 0 3 0 122 0 0 0 0 0 44 46 2 62 0 4 0 19 0 0 0 0 +denovo52 0 0 11 36 10 13 1 1 0 1 1 0 0 2 0 7 8 5 0 4 46 4 9 6 4 0 0 3 19 2 11 38 0 2 3 0 0 11 0 0 1 7 0 0 14 19 2 0 4 4 0 0 18 0 108 0 2 0 0 1 13 1 0 1 0 0 5 18 27 6 0 1 3 6 0 6 0 4 1 0 6 6 1 0 1 39 10 2 45 2 7 1 0 48 0 3 5 0 16 0 0 0 4 4 17 10 10 9 +denovo53 36 0 0 0 0 5 0 0 0 0 0 19 0 0 121 0 0 0 0 0 0 17 0 2 18 0 0 0 11 0 0 0 0 0 5 0 0 135 0 0 0 0 0 0 34 0 0 3 0 58 0 94 49 0 0 0 71 0 0 0 8 0 0 1 0 16 0 0 0 0 0 16 4 0 0 1 0 0 0 1 0 0 0 0 0 185 0 0 5 0 0 0 0 0 0 5 0 2 32 0 0 2 0 3 0 0 0 3 +denovo50 22 18 1 2 4 4 5 6 3 0 2 23 0 0 0 0 0 3 0 13 12 9 11 16 9 34 1 5 19 1 0 0 10 4 23 0 0 7 58 45 1 20 0 0 0 15 9 5 3 16 8 0 0 17 1 6 0 23 0 12 2 0 0 7 13 14 0 0 0 40 5 4 31 31 3 8 0 4 3 0 1 14 40 0 20 89 0 0 18 0 16 15 5 24 0 0 32 9 10 11 27 0 0 26 0 0 0 17 +denovo51 0 0 21 10 7 0 1 174 0 0 12 0 1 2 22 9 23 10 2 5 5 0 0 13 0 5 5 15 7 1 0 0 2 4 2 0 27 0 0 27 0 6 0 12 7 0 4 1 6 2 2 0 0 4 23 0 32 18 0 14 0 0 0 0 28 0 5 0 0 0 0 2 0 0 5 2 13 11 2 7 0 6 0 0 6 17 0 11 0 44 4 18 7 0 0 51 0 6 0 4 0 2 1 0 0 10 28 0 +denovo823 1 1 2 0 0 2 0 4 0 0 0 2 0 0 0 1 0 0 0 0 0 3 0 1 11 0 1 1 0 0 0 0 0 2 0 2 1 0 0 0 0 0 0 0 3 5 3 0 1 1 3 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 2 0 0 0 1 0 0 2 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 1 3 0 0 +denovo697 3 0 0 3 0 0 0 0 3 0 0 4 0 0 0 0 2 2 0 0 0 1 0 2 2 0 0 1 0 2 0 1 0 2 1 0 4 0 0 0 0 0 0 0 1 0 1 4 1 1 3 0 0 0 2 0 0 0 0 0 1 3 0 0 2 0 0 0 0 0 0 0 1 0 0 0 0 3 1 0 3 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 1 0 1 0 +denovo162 4 0 2 0 1 10 4 10 1 0 0 1 1 1 1 7 0 0 0 1 0 0 2 2 3 8 0 2 14 2 29 4 1 5 9 10 0 3 7 0 5 2 9 20 0 9 2 3 1 9 2 9 0 8 3 0 1 0 0 0 0 7 0 1 1 1 1 3 7 0 3 8 9 1 4 6 0 0 1 2 3 0 8 6 1 7 1 6 1 2 1 4 0 2 0 1 4 1 3 0 0 0 0 12 10 18 0 0 +denovo211 0 1 0 0 0 0 2 0 1 2 0 0 0 3 0 10 1 3 2 0 3 1 1 0 0 0 0 0 0 0 0 3 5 5 6 1 0 14 0 8 0 0 0 1 5 0 0 2 1 5 7 0 19 0 0 0 0 1 0 1 6 1 0 0 0 0 1 12 1 0 7 0 6 9 0 3 0 1 3 1 2 0 0 13 0 0 1 1 1 1 14 26 9 0 0 1 1 7 4 0 14 1 39 0 14 0 0 7 +denovo34 0 0 9 2 0 0 2 3 2 0 0 0 2 5 0 2 141 0 0 0 0 1 42 1 18 2 21 9 20 13 5 21 0 0 8 2 3 0 22 7 26 1 7 0 3 310 0 0 1 6 0 39 9 15 43 24 0 5 0 0 2 4 0 2 44 0 0 0 13 6 3 18 7 1 1 2 3 46 1 0 2 8 8 0 4 0 2 3 188 0 0 8 0 0 0 0 0 0 4 3 0 0 0 0 0 37 0 8 +denovo30 7 0 1 0 0 8 3 7 6 2 0 3 0 1 0 0 0 16 0 0 10 3 0 0 5 0 2 0 1 0 0 0 1 0 1 2 0 0 5 20 0 0 0 0 2 16 0 0 1 0 9 76 5 0 0 121 0 13 21 127 1 40 0 25 8 9 21 24 22 0 26 0 1 0 0 6 0 2 2 1 45 4 19 82 172 6 4 0 10 20 0 1 0 5 69 0 1 1 5 20 0 0 23 1 120 84 16 0 +denovo32 0 6 6 0 0 0 0 23 0 0 62 0 0 0 2 0 0 72 0 1 0 34 6 0 0 0 0 0 17 0 0 0 60 0 17 0 0 0 28 73 0 3 0 0 17 0 0 0 0 42 42 88 0 5 17 0 0 0 0 0 0 0 0 66 0 0 0 0 46 0 8 1 10 34 0 0 0 19 6 118 0 0 0 0 0 123 16 0 0 0 0 0 3 0 0 96 37 31 52 40 0 12 0 50 0 0 0 0 +denovo33 15 23 18 0 11 30 12 79 28 2 0 1 11 4 2 40 0 2 0 4 0 8 2 34 7 0 6 7 4 3 9 5 2 7 17 0 1 47 3 1 4 9 3 1 5 1 0 5 51 2 6 6 3 9 15 3 3 6 0 23 9 11 0 7 12 7 3 0 6 18 1 1 2 4 0 70 0 33 22 2 14 8 2 0 1 84 4 0 7 3 1 12 1 10 0 2 9 0 3 14 17 2 4 23 28 3 1 12 +denovo38 4 14 0 0 0 3 9 0 0 8 20 0 0 41 0 0 0 43 0 0 0 0 27 18 0 0 79 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 50 0 15 47 3 0 1 0 0 1 0 0 0 24 0 0 0 0 0 0 61 0 0 0 0 0 7 0 0 100 0 0 0 7 12 0 0 150 0 0 0 0 0 0 141 0 0 120 0 0 0 0 18 0 0 2 0 0 0 0 0 0 65 13 +denovo39 1 1 0 2 0 1 1 2 0 0 0 24 2 0 1 0 2 3 20 0 0 3 0 0 0 9 2 0 0 3 26 1 0 1 14 0 15 1 2 15 2 0 193 267 0 2 0 0 1 0 4 49 17 0 2 9 8 1 20 22 9 4 21 3 0 0 2 0 2 0 0 6 21 0 89 0 0 3 0 0 5 3 0 4 0 22 0 0 12 21 0 8 0 24 13 7 0 0 7 3 26 2 3 3 0 15 21 6 +denovo633 0 0 1 1 0 1 0 0 0 1 0 2 0 1 0 0 3 1 0 1 0 0 3 5 2 2 0 1 1 3 0 4 0 5 0 0 1 0 0 7 2 0 7 0 6 0 2 3 3 3 0 0 0 0 1 0 0 0 0 0 1 0 0 0 3 2 0 0 0 0 0 0 2 1 0 5 0 0 1 0 0 0 0 0 0 0 0 0 1 3 0 0 0 0 0 3 0 0 2 0 0 0 0 0 0 0 0 2 +denovo18 224 0 0 0 0 0 8 3 0 10 38 0 2 0 61 120 43 0 10 4 0 0 2 0 0 0 0 5 0 0 0 0 0 0 1 216 0 0 0 0 0 8 0 0 0 0 4 0 0 1 0 0 1 47 0 0 76 29 26 54 0 0 17 0 0 0 11 0 0 0 2 10 15 22 0 0 74 0 0 0 0 0 10 0 0 0 15 70 14 0 0 22 80 31 0 0 2 3 5 23 0 10 0 0 244 143 0 36 +denovo19 2 5 16 0 0 6 10 15 0 10 4 0 3 1 0 11 37 20 1 0 0 102 10 5 0 57 49 0 14 33 0 55 39 3 0 125 0 43 35 18 4 25 0 0 4 0 14 6 14 0 7 0 6 14 13 0 0 40 0 13 0 2 1 11 0 8 0 97 1 2 0 42 12 57 0 8 0 13 24 9 19 3 43 0 1 26 6 38 0 1 69 68 29 80 0 0 20 12 6 37 19 14 5 0 14 41 13 23 +denovo12 33 0 35 150 13 19 17 12 90 10 12 59 2 5 28 91 24 0 1 28 32 27 0 12 0 0 0 5 0 215 0 58 0 0 0 0 1 0 0 0 123 13 5 1 2 56 0 2 29 49 67 0 68 0 77 0 0 15 2 67 15 17 0 16 1 1 11 30 0 2 0 77 16 25 26 1 0 3 2 2 9 0 1 0 2 0 26 243 20 5 9 0 0 1 5 0 7 0 3 1 24 0 3 0 78 12 105 6 +denovo13 52 0 0 0 0 24 0 4 0 36 43 0 13 0 55 270 39 0 28 8 0 0 15 11 14 0 0 0 0 0 0 0 0 0 0 246 0 0 86 5 90 0 0 0 4 0 26 5 15 0 0 0 0 6 0 0 0 9 25 0 37 25 4 0 12 0 23 0 5 97 4 2 79 49 0 0 89 19 39 8 28 1 3 0 0 0 0 92 25 152 8 85 20 13 0 24 6 6 11 58 37 5 0 140 60 78 2 45 +denovo10 0 0 0 0 0 9 0 0 0 27 0 0 0 49 0 0 0 0 0 0 0 0 0 52 0 20 0 44 0 75 0 46 55 148 6 0 0 0 0 46 218 0 0 198 147 124 0 5 4 0 0 0 0 5 0 188 0 28 73 114 12 0 0 0 0 0 0 0 0 0 0 97 43 4 0 0 0 0 0 1 45 33 3 0 0 32 0 0 0 48 23 0 0 0 0 0 52 141 0 0 0 34 13 0 0 0 111 24 +denovo11 6 3 9 44 3 14 9 7 44 9 0 1 0 3 17 132 52 0 4 10 1 10 5 2 0 0 9 16 0 169 24 86 7 1 0 78 5 0 49 0 1 30 11 0 0 29 6 0 93 0 52 9 261 4 79 0 0 39 1 22 89 27 0 13 6 0 16 104 0 3 0 46 0 26 75 1 0 10 6 2 16 0 8 0 0 0 15 145 9 2 0 1 1 0 5 2 2 1 4 1 31 16 1 266 76 5 54 8 +denovo17 11 64 0 0 0 2 0 0 0 0 0 3 0 1 0 218 0 0 0 0 43 80 0 7 0 0 0 0 11 106 69 45 2 13 2 0 24 0 7 0 27 70 0 55 98 0 48 0 1 0 10 0 8 0 15 0 0 0 0 0 43 4 0 6 41 26 0 0 0 0 1 0 0 0 0 14 0 1 0 0 0 57 0 0 28 0 12 2 0 34 2 1 0 53 0 26 6 0 0 0 309 0 19 12 151 21 0 18 +denovo1210 2 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 3 1 0 0 2 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 2 0 0 0 1 0 0 0 1 1 0 0 1 0 2 1 0 0 2 1 0 1 1 0 0 0 0 diff --git a/test/oracle/fixtures/gut_counts.tsv.license b/test/oracle/fixtures/gut_counts.tsv.license new file mode 100644 index 0000000..f09c155 --- /dev/null +++ b/test/oracle/fixtures/gut_counts.tsv.license @@ -0,0 +1,4 @@ +SPDX-License-Identifier: CC-BY-4.0 +SPDX-FileCopyrightText: 2021 Jacob T. Nearing et al. (figshare doi:10.6084/m9.figshare.14531724.v1) +Modified 2026 by Jonathan D.A. Jewell: one study extracted, samples intersected with metadata, +features filtered by prevalence (see test/oracle/make_fixtures.jl). See docs/DATASETS.md. diff --git a/test/oracle/fixtures/gut_groups.tsv b/test/oracle/fixtures/gut_groups.tsv new file mode 100644 index 0000000..b5330fa --- /dev/null +++ b/test/oracle/fixtures/gut_groups.tsv @@ -0,0 +1,109 @@ +sample group +parkinsonfecalbacteria.C1 H +parkinsonfecalbacteria.C5 H +parkinsonfecalbacteria.C14 H +parkinsonfecalbacteria.C15 H +parkinsonfecalbacteria.C18 H +parkinsonfecalbacteria.C19 H +parkinsonfecalbacteria.C21 H +parkinsonfecalbacteria.C24 H +parkinsonfecalbacteria.C26 H +parkinsonfecalbacteria.C32 H +parkinsonfecalbacteria.C34 H +parkinsonfecalbacteria.C35 H +parkinsonfecalbacteria.C44 H +parkinsonfecalbacteria.C46 H +parkinsonfecalbacteria.C49 H +parkinsonfecalbacteria.C51 H +parkinsonfecalbacteria.C52 H +parkinsonfecalbacteria.C58 H +parkinsonfecalbacteria.C63 H +parkinsonfecalbacteria.C68 H +parkinsonfecalbacteria.C70 H +parkinsonfecalbacteria.C72 H +parkinsonfecalbacteria.C73 H +parkinsonfecalbacteria.C74 H +parkinsonfecalbacteria.C76 H +parkinsonfecalbacteria.C79 H +parkinsonfecalbacteria.C80 H +parkinsonfecalbacteria.C82 H +parkinsonfecalbacteria.C85 H +parkinsonfecalbacteria.C86 H +parkinsonfecalbacteria.C87 H +parkinsonfecalbacteria.C88 H +parkinsonfecalbacteria.C89 H +parkinsonfecalbacteria.C90 H +parkinsonfecalbacteria.C95 H +parkinsonfecalbacteria.C98 H +parkinsonfecalbacteria.C102 H +parkinsonfecalbacteria.C103 H +parkinsonfecalbacteria.C104 H +parkinsonfecalbacteria.C105 H +parkinsonfecalbacteria.C107 H +parkinsonfecalbacteria.C111 H +parkinsonfecalbacteria.C114 H +parkinsonfecalbacteria.C116 H +parkinsonfecalbacteria.C118 H +parkinsonfecalbacteria.C119 H +parkinsonfecalbacteria.C123 H +parkinsonfecalbacteria.C124 H +parkinsonfecalbacteria.C134 H +parkinsonfecalbacteria.C135 H +parkinsonfecalbacteria.C136 H +parkinsonfecalbacteria.C137 H +parkinsonfecalbacteria.C142 H +parkinsonfecalbacteria.C143 H +parkinsonfecalbacteria.C146 H +parkinsonfecalbacteria.P8 PAR +parkinsonfecalbacteria.P9 PAR +parkinsonfecalbacteria.P11 PAR +parkinsonfecalbacteria.P12 PAR +parkinsonfecalbacteria.P16 PAR +parkinsonfecalbacteria.P17 PAR +parkinsonfecalbacteria.P24 PAR +parkinsonfecalbacteria.P26 PAR +parkinsonfecalbacteria.P28 PAR +parkinsonfecalbacteria.P31 PAR +parkinsonfecalbacteria.P34 PAR +parkinsonfecalbacteria.P37 PAR +parkinsonfecalbacteria.P41 PAR +parkinsonfecalbacteria.P42 PAR +parkinsonfecalbacteria.P43 PAR +parkinsonfecalbacteria.P45 PAR +parkinsonfecalbacteria.P50 PAR +parkinsonfecalbacteria.P51 PAR +parkinsonfecalbacteria.P53 PAR +parkinsonfecalbacteria.P56 PAR +parkinsonfecalbacteria.P57 PAR +parkinsonfecalbacteria.P59 PAR +parkinsonfecalbacteria.P61 PAR +parkinsonfecalbacteria.P63 PAR +parkinsonfecalbacteria.P65 PAR +parkinsonfecalbacteria.P66 PAR +parkinsonfecalbacteria.P68 PAR +parkinsonfecalbacteria.P69 PAR +parkinsonfecalbacteria.P71 PAR +parkinsonfecalbacteria.P73 PAR +parkinsonfecalbacteria.P74 PAR +parkinsonfecalbacteria.P77 PAR +parkinsonfecalbacteria.P79 PAR +parkinsonfecalbacteria.P83 PAR +parkinsonfecalbacteria.P85 PAR +parkinsonfecalbacteria.P87 PAR +parkinsonfecalbacteria.P88 PAR +parkinsonfecalbacteria.P93 PAR +parkinsonfecalbacteria.P94 PAR +parkinsonfecalbacteria.P95 PAR +parkinsonfecalbacteria.P99 PAR +parkinsonfecalbacteria.P100 PAR +parkinsonfecalbacteria.P103 PAR +parkinsonfecalbacteria.P105 PAR +parkinsonfecalbacteria.P107 PAR +parkinsonfecalbacteria.P112 PAR +parkinsonfecalbacteria.P113 PAR +parkinsonfecalbacteria.P114 PAR +parkinsonfecalbacteria.P115 PAR +parkinsonfecalbacteria.P116 PAR +parkinsonfecalbacteria.P117 PAR +parkinsonfecalbacteria.P119 PAR +parkinsonfecalbacteria.P120 PAR diff --git a/test/oracle/fixtures/gut_groups.tsv.license b/test/oracle/fixtures/gut_groups.tsv.license new file mode 100644 index 0000000..f09c155 --- /dev/null +++ b/test/oracle/fixtures/gut_groups.tsv.license @@ -0,0 +1,4 @@ +SPDX-License-Identifier: CC-BY-4.0 +SPDX-FileCopyrightText: 2021 Jacob T. Nearing et al. (figshare doi:10.6084/m9.figshare.14531724.v1) +Modified 2026 by Jonathan D.A. Jewell: one study extracted, samples intersected with metadata, +features filtered by prevalence (see test/oracle/make_fixtures.jl). See docs/DATASETS.md. diff --git a/test/oracle/fixtures/soil_counts.tsv b/test/oracle/fixtures/soil_counts.tsv new file mode 100644 index 0000000..f8fa1e5 --- /dev/null +++ b/test/oracle/fixtures/soil_counts.tsv @@ -0,0 +1,301 @@ +feature Bact89 Bact1z3z2R Bact5z5z2 Bact3z5z2 Bact183 Bact3z1z2R Bact1z2z2R Bact3z4z2 Bact128 Bact3z5z2R Bact3z3z2 Bact90 Bact197 Bact5z5z2R Bact127 Bact175zFB Bact5z1z2 Bact1z5z2 Bact101 Bact5z3z2 Bact3z4z2R Bact198 Bact1z1z2 Bact180 Bact177 Bact192 Bact5z2z2R Bact5z1z2R Bact5z2z2 Bact181 Bact3z3z2R Bact176 Bact86 Bact194 Bact3z2z2R Bact5z3z2R Bact5z4z2 Bact1z3z2 Bact105 Bact5z4z2R Bact182 Bact196 Bact130 Bact87 Bact184 Bact102 Bact193 Bact103 Bact1z1z2R Bact126 Bact195 Bact1z4z2 Bact3z1z2 Bact1z5z2R Bact3z2z2 Bact1z4z2R Bact190 Bact104 Bact88 Bact179 Bact191 Bact1z2z2 Bact178 +f2491278404b0c23c7d549b7d79de8fe 474 58 275 134 10 756 25 553 174 216 236 86 0 35 47 19 633 3 188 18 415 0 731 18 92 1 148 648 147 4 184 65 140 15 157 22 747 21 98 0 77 0 79 114 0 53 3 51 629 0 0 11 585 16 222 5 137 429 171 42 38 403 42 +1b992265f94bd0b3ce677c85f99575d4 473 23 54 14 2 54 4 10 543 12 26 281 0 0 27 0 81 2 153 14 3 0 492 14 4 0 18 96 16 0 38 22 198 25 22 2 78 11 3 0 0 0 106 44 4 68 0 183 365 2 0 0 44 0 24 0 3 173 29 9 3 91 11 +d196b2a85dd60ecfebd63caf43abadfb 203 130 258 301 89 297 233 485 140 308 170 320 81 106 266 101 190 68 314 505 369 6 161 218 64 106 971 206 1124 36 154 68 212 360 262 303 497 102 184 140 80 24 141 444 51 86 126 333 139 100 57 82 248 104 175 79 147 311 377 141 47 104 79 +88ee5c3dfa490e112205283645ac6f74 134 38 109 200 14 238 22 231 45 226 147 205 26 19 0 0 55 21 106 106 194 7 89 131 47 27 104 80 82 3 74 49 254 64 39 33 157 23 77 0 19 0 0 87 5 64 24 125 62 0 22 39 168 52 220 47 24 516 49 29 0 17 24 +0799e88db0fc1c4203d47605dee8e882 133 58 145 129 4 255 7 102 117 151 119 109 25 19 26 5 83 19 173 194 64 0 200 8 11 42 127 131 115 0 31 11 216 52 69 78 266 25 50 6 11 13 84 128 0 21 19 141 118 21 9 47 199 29 91 17 47 482 103 13 30 41 19 +43ebc28456c2bf0a1509166f72156cc2 129 7 46 2 0 131 14 0 8 1 28 84 2 34 0 0 326 1 61 0 2 0 81 14 22 0 0 329 0 0 72 9 93 10 29 0 46 10 5 0 0 0 1 12 0 25 0 13 96 0 0 1 123 0 12 1 9 27 4 0 0 67 0 +bb07fd24068676b9ecf8b18e5947ca5f 128 103 243 165 0 242 56 56 289 256 115 163 34 58 261 55 49 76 268 159 29 1 69 110 52 78 331 106 260 0 29 65 156 322 171 84 352 64 73 51 49 0 344 296 27 314 55 384 86 185 51 118 185 117 85 103 170 516 105 79 3 4 50 +64411a486ff92818897e3e82f9d23d11 127 3 41 41 0 112 3 17 0 40 26 148 0 4 160 0 78 0 48 7 17 0 43 0 45 0 8 80 18 0 11 46 48 0 9 9 54 5 4 0 10 0 0 20 0 13 0 35 68 2 3 1 95 0 95 0 43 30 13 0 0 57 8 +6cb7733ce7ac764ec099e7f8ae57b2f0 119 0 0 6 0 16 0 4 37 9 33 24 0 1 12 26 48 0 119 0 7 0 191 0 0 0 67 38 50 0 31 0 19 0 0 0 0 0 6 0 0 0 53 120 0 5 0 159 154 6 0 1 8 1 0 0 9 25 77 0 0 108 0 +c82ae198cfb2fd9b4ecf398040cca195 106 7 85 74 21 187 0 255 34 81 32 171 8 13 125 2 165 0 99 525 127 0 281 27 88 31 181 181 168 0 55 48 108 62 41 153 214 0 37 0 58 6 175 33 17 34 6 171 173 80 19 0 125 0 115 0 56 318 45 49 0 36 35 +5dad23415655250f10b44c3e3303eb3e 94 8 60 39 0 59 0 74 64 59 27 137 0 5 3 35 51 3 85 9 53 0 85 6 14 0 23 85 6 0 64 24 84 18 33 3 168 3 31 0 5 0 98 39 0 61 11 140 101 4 0 0 40 0 70 0 12 188 34 13 0 21 20 +3589aeb4cb9a9d9cdf935a073e3ca5ac 93 0 80 0 2 11 0 40 36 0 13 18 0 9 0 0 80 2 26 19 20 0 0 5 35 0 26 84 8 0 0 44 23 11 60 6 52 0 13 0 14 0 10 17 4 12 0 91 0 13 9 0 18 0 0 4 46 35 24 3 0 3 27 +37a565ccbbec24a0fae9e0c72d5d30b6 83 1 0 42 0 170 13 136 14 44 150 175 0 2 0 23 71 5 16 37 138 0 296 1 16 0 38 97 32 0 326 0 162 0 0 27 82 0 23 0 6 0 3 6 0 27 0 88 240 0 0 4 149 6 313 9 10 167 11 2 0 95 2 +65c62076cb1ba6b7c134043acd3fc141 80 29 51 11 0 34 0 66 2 28 21 89 0 1 8 0 0 0 55 30 28 0 10 21 31 8 14 28 21 0 11 0 27 107 21 10 108 3 13 0 15 0 23 27 0 0 15 36 4 11 11 9 27 9 27 5 21 45 13 0 0 0 4 +c5bd162e6dcc0278b35e691c904e6fbc 77 55 70 143 89 131 0 145 104 197 121 194 164 19 166 76 76 74 121 253 129 23 108 127 0 190 268 66 125 39 0 28 108 149 24 113 137 23 95 177 9 177 93 237 92 99 52 232 84 168 163 107 80 122 109 125 70 238 196 61 240 15 48 +ce106756f2dbb337934566ae98b31e6e 76 11 9 6 3 55 0 12 30 13 23 27 0 3 13 0 21 0 2 0 14 0 18 21 22 0 0 22 0 0 9 15 41 3 6 0 13 8 4 0 23 0 53 21 0 58 3 23 11 12 0 0 32 0 16 0 36 21 9 0 0 0 15 +a8ff1696d560863e5397df5c919783a2 71 12 49 10 29 59 3 26 16 4 125 66 5 2 16 0 13 1 5 1 0 0 0 45 52 0 15 10 13 5 423 9 26 0 78 3 77 0 0 0 34 0 31 25 33 6 0 4 23 6 0 0 21 9 438 4 4 29 8 67 0 47 40 +b915d820cf37fa8b2867451ee85b3f18 65 13 56 18 2 47 11 8 75 19 46 52 0 7 49 32 122 6 94 0 13 0 99 13 12 3 25 51 30 0 17 49 72 24 21 0 79 14 9 0 8 0 41 70 0 58 0 72 54 22 8 4 55 2 68 1 131 61 54 8 0 82 20 +4673a4d0354ad8a2e8ecb58dbd036b1e 63 19 39 77 0 126 0 45 72 75 33 87 1 14 43 0 75 12 125 120 59 0 33 11 37 15 85 78 129 4 35 49 75 23 26 95 127 10 34 0 24 0 181 118 3 51 0 87 47 9 6 5 106 12 79 10 70 36 115 18 0 13 7 +de83c1220353a58123312831416388d7 62 0 13 113 0 5 0 0 207 146 74 357 0 10 44 0 206 19 51 227 0 0 282 0 0 6 27 219 33 0 105 0 199 0 19 173 0 0 7 0 0 7 279 71 0 20 0 312 291 34 0 20 0 33 224 30 14 0 394 0 6 155 0 +36c667df7a8e1e04fdda148de0e1d948 62 13 53 173 50 100 3 156 7 37 75 37 17 21 6 4 62 26 26 113 42 2 77 29 21 48 33 26 113 8 18 73 25 46 15 44 67 57 23 10 20 20 4 37 16 8 18 13 17 49 51 33 230 4 81 9 163 29 30 47 36 60 39 +04c0228750ba6ff4a229681609ab5158 56 9 8 57 0 14 2 18 0 71 35 1 0 0 2 0 24 0 0 3 5 0 133 0 1 0 0 37 11 0 53 14 7 8 8 8 43 5 0 0 0 0 1 92 0 0 0 10 133 0 2 2 2 0 0 0 39 0 92 2 0 53 0 +a8846f8a679ff0a6519b233f323161ad 53 7 80 19 9 38 0 68 104 7 11 38 0 8 16 0 39 0 85 52 34 0 26 9 22 4 46 50 36 0 8 25 34 30 34 8 109 4 11 0 6 0 134 37 2 6 12 12 19 0 2 2 29 0 30 0 12 100 43 14 0 15 20 +5c181118ff2d4b11989ba13defcd8a86 52 11 27 60 28 73 11 90 40 68 36 98 0 1 94 37 23 15 39 88 92 0 26 6 13 0 55 44 23 1 21 31 19 49 24 29 88 4 40 0 21 0 50 61 0 48 0 90 19 73 0 33 56 38 35 18 14 74 38 35 4 21 44 +fb0a92f301d14c044a9203b5cc10cb5e 52 2 36 30 5 30 9 14 11 15 39 48 3 1 8 0 78 5 26 0 8 0 95 19 6 17 17 19 43 4 7 58 20 11 13 3 34 11 2 0 16 0 13 42 0 9 0 14 15 14 5 3 99 0 64 2 102 17 29 9 1 66 10 +dada9369670d604086af10f17cf47a2c 52 3 8 19 0 13 0 78 29 14 13 26 0 4 4 0 23 0 20 2 50 0 23 2 5 0 9 29 10 0 19 6 14 0 1 0 19 0 7 0 4 0 17 4 0 31 0 13 13 2 0 0 13 1 65 5 0 0 7 0 0 20 9 +95eda99f5b5cdd2d40b68ba9f256d49c 50 0 36 11 0 75 0 23 37 13 20 63 10 12 6 0 70 0 72 14 16 0 141 18 7 32 14 72 7 0 34 0 47 15 15 7 36 13 3 0 7 0 21 26 0 32 4 22 128 5 0 0 50 0 51 0 4 57 14 0 0 61 0 +1a00d328b9baddfbbdf759055cd8b1bf 50 26 104 119 19 90 0 168 128 86 92 148 4 13 75 155 100 0 68 83 94 0 124 46 59 28 151 143 142 1 80 45 55 83 65 33 120 9 26 0 16 0 184 57 0 25 28 182 71 41 10 0 65 0 74 0 20 101 33 24 0 33 54 +c3c50d5ed7b25a83a7cea5e92ca5f159 49 11 7 28 8 97 9 15 6 10 13 32 6 18 31 0 13 15 41 11 26 4 20 37 18 14 43 11 72 9 14 31 35 38 10 45 22 3 23 17 14 4 10 56 6 9 25 25 17 16 6 5 30 2 12 13 55 41 37 19 0 0 21 +d809292a75e0be062d0c0ddc6900d721 49 0 6 8 0 24 0 6 10 2 8 10 0 4 0 0 49 0 5 0 15 0 13 0 7 0 12 67 5 0 8 11 6 2 8 0 15 0 4 0 0 0 6 5 0 5 0 4 17 0 0 0 14 0 13 0 3 31 2 6 0 19 3 +942d04d04bdf10cfe81e62e35c041322 45 4 20 10 0 12 0 46 4 7 14 9 0 0 0 0 40 0 11 0 13 0 0 6 13 0 0 46 0 0 10 12 17 5 11 0 49 0 2 0 4 0 3 3 0 6 0 0 2 0 0 0 15 0 23 0 0 52 0 4 0 4 9 +da33db8f5386510d763c44efdfcdfc5c 44 0 34 7 2 43 3 27 19 5 40 0 0 3 0 2 48 0 25 0 12 0 68 7 8 0 2 46 2 0 61 4 38 0 3 0 15 0 4 0 2 0 20 0 0 8 0 0 62 0 0 0 31 0 44 0 0 29 6 0 0 84 0 +12ff84927cccc0a1e30d567b9d63afdb 44 92 273 89 5 149 0 293 37 65 69 126 72 15 71 0 106 5 84 119 179 0 155 30 17 105 443 111 391 3 69 30 70 63 194 29 307 66 83 16 13 0 49 79 0 40 49 58 87 31 48 0 101 0 241 0 76 563 125 13 0 83 22 +82d277033e32ee6956fa6eea59f63bec 43 1 25 0 0 6 2 12 23 0 37 62 0 4 5 0 58 0 36 2 7 0 121 3 5 0 11 92 6 0 65 6 36 0 10 1 60 0 5 0 5 0 2 15 0 3 0 33 73 2 0 0 6 3 15 0 4 19 29 5 0 47 0 +1b7e30e34546b97c06b95a95e636b4ef 43 5 15 42 0 82 11 32 13 66 51 52 0 0 8 8 30 42 78 22 21 0 34 16 22 12 25 31 39 2 5 7 75 0 17 10 42 4 46 0 19 0 21 48 0 60 0 133 23 5 2 62 84 37 37 39 11 62 11 0 0 59 0 +c4ff55445066a2b9295a360c4fdc7dd0 41 60 178 1 4 8 2 8 0 1 6 33 0 2 76 0 24 1 96 276 8 0 25 2 10 0 68 30 45 0 21 10 16 6 72 67 167 24 11 2 0 0 25 90 0 8 5 49 16 4 0 0 5 0 15 1 0 136 30 16 0 3 13 +94c6db13e91d36550508d86275ac95fe 41 44 49 88 8 38 0 134 4 82 7 65 14 0 2 0 18 0 70 53 114 0 9 22 17 31 55 27 38 0 4 16 45 69 36 19 63 17 20 0 8 0 17 20 7 0 9 4 8 5 0 0 43 0 28 1 2 9 21 13 0 0 9 +a1ed988b20666611823c7e60605a6252 37 0 34 4 0 65 4 69 18 10 17 189 0 6 4 0 13 0 10 3 42 0 25 20 23 2 18 27 10 0 16 6 45 4 30 2 31 0 0 0 7 0 31 3 0 7 2 10 31 13 0 0 63 6 47 3 4 45 2 3 0 14 2 +f67605f996bc43297d1a37cecc9efe51 36 2 23 12 0 30 0 62 5 22 27 8 0 0 38 1 18 0 30 4 28 0 22 6 2 4 12 24 13 0 10 6 32 0 7 4 96 0 8 0 0 0 2 16 0 3 0 18 17 0 0 0 17 0 10 0 19 26 17 6 0 5 4 +1a0c3d0a2d06127ea303b20c92a99d11 36 5 14 11 12 45 2 14 0 15 8 44 2 0 0 0 7 6 38 7 6 0 9 5 0 0 15 26 8 0 36 2 31 22 24 5 37 8 7 0 6 0 0 10 7 10 4 32 21 0 0 3 29 10 26 2 8 53 12 9 0 8 10 +4b1ffbcf5121fef61210dda1d58413ea 36 2 0 5 11 14 0 17 7 11 0 23 0 0 2 0 28 2 40 7 19 0 16 34 0 0 31 27 15 0 0 0 15 0 0 5 11 2 8 0 2 0 9 0 0 0 0 22 12 0 0 3 6 4 11 0 0 37 0 0 0 0 0 +c2d6b8a1aa501ba39416992102c86cd7 35 76 49 145 10 29 22 65 0 104 26 10 26 5 0 0 4 22 24 261 33 0 8 27 0 38 63 0 51 2 0 1 31 50 43 76 93 43 44 0 0 2 0 53 0 9 9 96 7 0 40 28 41 28 16 17 85 39 44 0 3 0 0 +7d39e02521082738a79867453efc6302 34 34 54 52 14 43 3 74 12 58 30 17 2 4 0 0 29 13 2 79 28 0 41 20 14 11 52 21 56 3 0 18 30 20 45 21 87 30 9 1 6 0 10 9 6 4 3 44 34 4 6 32 33 17 25 8 19 138 0 3 0 0 17 +37629beadee8435b48fe04409494ccc4 33 10 30 31 0 40 0 40 21 25 41 2 0 3 37 19 10 0 34 70 46 0 12 9 0 6 38 4 40 0 10 0 28 3 5 18 20 12 28 0 19 0 8 41 1 39 1 21 8 20 0 0 37 6 1 4 14 58 43 15 1 7 7 +9e7722c7da6abc43fcae691efd2889f3 33 0 25 44 0 31 10 16 9 15 6 30 14 49 2 0 18 10 14 4 6 0 24 8 3 4 11 16 2 8 19 5 23 1 11 4 27 5 1 1 13 7 0 3 5 32 2 13 11 3 8 39 19 10 48 18 23 48 0 2 4 38 1 +d68ab0e5f630d2c04402d37116898043 33 2 31 0 0 25 3 5 5 0 12 21 0 0 0 2 5 0 17 9 0 0 19 6 14 0 3 8 2 0 7 14 31 0 17 0 27 6 2 0 5 0 40 5 0 9 0 35 13 0 3 0 33 0 14 0 18 77 0 0 0 6 0 +180838aea1823d2f45e8671ad3d406c1 33 3 10 80 0 53 13 56 0 106 54 156 0 7 7 44 123 29 50 132 38 0 6 6 0 0 249 113 144 0 14 0 96 5 4 51 138 0 93 17 0 0 1 199 0 15 1 130 6 0 13 31 32 39 87 34 17 154 141 0 0 28 0 +92c775e9acbe542ad207cbbbc297fd29 32 2 3 21 0 30 1 26 1 44 4 8 0 0 3 0 14 1 16 0 17 0 11 0 12 3 4 15 0 0 2 8 24 0 4 0 27 4 14 0 0 0 0 5 0 0 0 21 10 0 0 7 16 0 19 2 9 36 7 2 1 3 0 +99df6f584e6f3b2150c283612b0d239c 32 0 114 7 0 27 6 23 0 4 15 39 0 7 0 0 79 0 50 28 11 0 37 6 8 0 38 103 39 0 25 7 68 0 52 3 129 0 4 0 0 0 0 5 0 14 2 5 31 0 17 1 19 1 129 2 24 93 10 3 0 20 2 +514cd6f3edae862b5c8ddc3d534886dd 32 6 23 17 1 36 0 37 23 4 36 2 2 4 13 12 30 2 24 0 27 0 33 4 9 0 23 27 27 8 15 19 19 2 11 6 56 4 11 0 9 2 30 8 0 21 0 15 36 7 0 0 27 0 35 7 5 25 28 0 0 31 4 +73b1706fdd9db3d46f51dbaa881bede8 30 2 19 30 2 24 0 64 22 37 8 0 0 4 6 0 17 0 5 0 35 0 67 5 2 0 3 38 6 0 10 6 9 2 6 0 23 0 7 0 0 0 36 4 0 10 0 18 53 0 0 0 16 0 47 0 13 33 2 0 0 2 5 +acf8b8050768d246473c5511b06299a7 30 2 89 2 3 28 10 24 11 0 29 16 0 9 5 0 44 0 18 0 24 0 54 10 26 0 4 67 1 0 39 35 19 21 90 2 74 0 12 0 20 0 14 6 0 13 0 7 37 2 7 0 20 0 28 5 23 38 13 27 0 52 26 +eb9f54484c32710a080585d358b9c7c8 30 2 11 8 0 18 6 11 31 8 10 81 0 0 9 26 38 0 46 11 12 0 70 4 6 0 19 46 25 0 26 7 34 5 9 3 29 3 3 0 0 0 41 14 0 10 0 20 49 2 0 0 11 0 28 0 6 39 42 5 0 52 5 +8204e7ce249b0d9b9bb3629ecd923bf4 29 0 2 10 0 12 0 16 81 6 43 67 0 5 4 7 69 0 27 3 12 0 44 0 0 0 7 91 12 0 66 0 76 0 0 5 19 0 17 0 0 0 79 13 0 52 0 79 41 15 2 0 18 0 9 0 38 28 8 0 0 94 0 +17503c924d47a801906a4ef01f8de07d 29 0 0 32 0 39 0 12 0 51 3 6 0 2 0 77 94 0 18 6 7 0 38 5 0 0 105 70 80 0 17 0 8 0 1 0 15 0 5 0 0 0 4 11 1 9 1 65 41 0 0 0 19 0 9 0 77 0 12 0 0 20 0 +9d20aeb82ccc7cb7cf604684deb71ff9 28 0 50 3 0 12 3 8 2 2 0 5 0 2 0 0 45 0 0 0 5 0 119 2 30 0 0 38 0 0 2 12 17 16 37 0 75 0 2 0 3 0 3 0 0 0 0 0 84 0 2 0 7 0 11 0 37 56 0 2 0 43 2 +d7c338aec79c5cd1ba65e8be121d57a0 28 92 167 64 194 61 115 95 34 106 66 48 326 432 71 16 47 47 75 257 87 108 13 223 71 202 209 43 150 240 38 88 142 100 98 134 138 30 70 101 97 299 46 163 836 44 132 76 24 85 282 73 47 53 53 45 59 118 114 622 206 32 57 +3ceca3d8e04e29f8917d147db20a8b8d 28 9 22 11 0 28 2 14 9 14 17 3 2 0 4 0 16 4 9 11 7 0 9 3 0 6 10 24 11 0 12 3 23 12 16 4 3 5 5 0 0 0 16 6 0 30 6 24 6 2 0 0 11 6 29 2 1 25 7 0 7 16 1 +3bf2cc0a4790d10bc595a2907583cfe0 28 3 55 13 15 42 19 25 6 13 16 5 7 61 3 3 24 0 23 73 23 0 12 26 17 21 77 23 91 25 18 25 21 31 15 52 47 4 46 84 18 23 4 13 4 19 3 7 19 3 15 1 29 0 34 0 35 45 33 14 21 45 16 +df607920b2114d5d59abf6431e17eef0 27 21 44 25 27 80 19 86 16 25 49 0 6 13 8 23 49 17 47 18 65 0 26 46 7 6 41 40 31 31 31 21 43 18 31 19 59 9 40 12 37 15 25 40 4 24 0 20 42 11 5 20 63 15 80 19 12 40 35 10 14 21 16 +69f5520376e085e51c9d70c0632a2692 27 229 406 37 92 52 173 81 0 36 64 7 61 131 86 5 8 117 178 241 72 7 12 101 50 148 459 10 420 55 16 67 43 129 200 142 45 87 63 167 114 101 11 319 129 71 148 68 0 140 69 180 30 179 6 148 22 80 88 159 184 8 35 +e4bb13b5577f2a7893aca945cebb6fdf 27 21 80 86 2 41 21 97 69 81 78 34 19 2 8 0 16 60 36 23 85 0 46 8 19 21 112 26 61 0 9 12 73 32 46 16 100 13 32 12 12 24 54 147 0 11 9 84 15 5 26 108 43 119 2 83 20 29 38 6 70 5 16 +47fd77ce7b057ae4abaa023d6efaa27e 27 2 66 33 13 36 1 79 0 16 0 11 5 1 3 0 25 1 45 5 72 0 0 29 21 15 44 40 41 6 0 50 14 31 29 0 79 2 22 0 20 0 0 14 18 1 3 5 0 6 9 0 26 0 0 2 13 99 0 67 1 0 34 +c4ff54fd4b551403a58681a668aea5e3 27 24 98 59 0 147 24 95 0 102 25 0 0 0 8 0 0 6 26 0 77 0 0 22 53 0 70 0 86 0 0 15 0 29 65 0 103 16 12 0 15 0 0 23 0 0 18 0 0 0 4 25 118 0 56 13 49 152 0 0 0 0 17 +cea6313cd47cbd5a86a8ccf233e26700 25 2 159 1 0 9 12 64 0 0 3 15 0 0 0 0 15 0 7 2 19 0 107 0 1 0 3 15 5 0 0 0 29 0 79 3 91 0 10 0 0 0 0 6 0 8 3 4 71 0 4 3 9 7 21 2 8 124 19 0 0 74 0 +9570323634a9ebf884c719c3159e106c 24 0 19 6 4 26 0 20 16 15 3 28 0 8 33 0 26 0 60 17 7 0 27 79 32 37 23 30 23 0 2 11 19 46 8 18 16 4 8 0 3 0 10 15 2 4 8 31 19 0 15 0 14 0 19 0 24 15 5 24 1 5 13 +8e981f693e49c59cddc257adfd35d265 22 6 13 29 4 26 60 18 6 16 24 16 14 26 5 5 17 33 32 19 7 0 36 4 11 14 30 23 37 0 8 0 14 22 13 17 20 16 7 10 11 6 9 32 0 24 5 27 27 1 38 24 40 9 27 15 53 15 18 0 9 15 0 +cf1dd271ef1837a18cc53c056bca2016 22 186 60 21 67 29 46 21 89 26 37 113 68 0 166 106 7 41 75 448 49 0 11 61 44 218 77 12 32 45 15 92 20 270 22 189 37 62 15 0 47 45 146 45 61 39 41 222 6 247 0 81 10 86 8 74 48 54 50 86 128 0 83 +7b7205f403711a118313948e000d72a7 22 3 22 5 0 5 0 13 17 8 19 15 0 0 3 0 5 0 31 6 2 0 12 2 4 0 16 7 10 0 4 5 19 0 17 1 20 0 4 0 0 0 0 4 0 13 0 17 7 0 0 0 0 0 81 0 0 11 7 0 0 11 1 +c0504760158e5b6c83ab80af92a6354d 21 4 20 15 6 29 0 18 19 18 13 8 0 4 18 10 11 0 47 33 16 0 8 19 16 5 49 12 71 19 3 30 16 4 11 34 13 0 10 3 29 0 27 39 9 14 4 20 7 10 0 2 21 0 0 3 7 13 24 27 0 0 9 +2e0a3884c52aa783a2bd13faac54c68b 21 3 17 4 0 10 9 6 0 1 6 28 0 9 0 0 17 0 16 2 2 0 14 7 0 4 0 15 0 0 18 0 14 0 10 2 5 1 5 0 3 0 0 16 0 4 0 11 42 0 0 0 8 0 5 0 1 12 8 0 0 12 4 +4813557a2743f5583637e4b45c327141 21 0 0 2 0 23 2 19 8 4 6 36 0 3 2 2 14 6 7 0 24 0 15 4 0 0 9 18 7 0 9 2 17 0 0 0 4 0 7 0 0 0 28 0 0 21 0 33 23 0 0 9 11 3 14 8 0 10 11 0 0 14 0 +4d38ce59e73cce3e38eee769aafa993f 21 17 32 13 40 38 6 26 44 26 11 6 13 5 28 85 38 45 49 104 20 0 45 43 45 34 49 28 37 21 12 29 20 37 21 41 80 16 5 0 17 18 39 27 26 29 12 22 49 26 6 53 24 80 5 58 22 79 41 31 94 8 33 +ba895a0f797cf1df5943b22a36a9e1c5 20 9 4 23 2 22 7 13 0 18 10 9 0 6 4 0 3 5 37 4 15 0 19 4 8 2 0 10 0 0 13 5 22 3 5 10 9 2 5 0 21 0 6 9 0 17 0 0 36 0 0 2 14 2 37 3 28 2 0 0 0 11 2 +e05cfe4cea5f9fd60ae4c7c59aaf8607 20 36 4 6 1 78 5 52 10 33 26 101 5 0 77 2 5 36 9 158 59 0 26 13 6 15 142 0 128 0 0 0 183 8 0 115 89 44 61 0 32 0 76 40 0 0 2 70 27 36 0 62 84 37 196 56 83 405 0 4 0 0 6 +a5ebc0eaa057cd494acf02f0736377be 20 11 28 1 0 32 2 0 37 10 19 2 0 0 9 0 13 5 22 2 0 0 10 0 1 0 10 20 4 0 24 0 17 0 8 1 13 4 17 0 0 0 50 10 0 19 0 131 7 13 0 0 18 7 17 0 0 0 6 0 0 33 2 +95c4651e5ab3f303a7e1a17914b9f445 19 3 17 2 2 8 2 30 2 1 4 13 0 0 0 3 15 3 19 21 22 0 4 7 3 2 45 21 27 0 8 5 14 14 4 4 24 0 6 0 0 0 0 7 0 3 4 21 6 6 0 0 6 0 0 0 4 16 18 4 0 0 8 +aef15c2dd62d314af896530503b2ae8e 19 0 14 0 0 8 3 35 10 0 4 12 0 0 20 0 9 6 9 5 16 0 36 0 0 2 1 5 0 0 1 7 12 1 14 0 38 0 1 0 1 0 19 16 0 3 0 15 32 4 0 8 4 7 16 11 0 14 21 7 0 8 6 +cd4625958329f28c99b1cff1bf06316a 19 0 11 12 0 17 0 20 24 3 5 29 0 0 3 0 12 0 28 0 7 0 8 12 13 3 0 5 6 0 4 7 6 1 14 7 0 2 2 0 9 0 15 0 0 2 0 10 13 0 0 0 4 0 3 0 3 42 2 9 0 0 19 +1255e37c601a567ae332578f5561b4a7 18 0 11 10 0 23 2 7 10 8 36 50 0 0 0 0 40 2 13 0 5 0 85 0 3 0 0 24 6 0 24 9 13 0 1 3 6 0 0 0 0 0 9 4 0 17 0 17 15 0 0 2 25 0 31 4 5 9 12 0 0 34 0 +9ec3b2c1cc59f50d341d3ed5c1d70aa6 18 4 36 16 4 5 2 12 14 12 20 10 0 2 0 2 14 6 39 3 8 0 27 6 5 3 17 20 15 0 15 1 27 3 5 1 11 0 7 0 10 0 4 10 0 15 0 50 12 5 0 0 5 0 31 0 6 17 7 6 0 26 0 +fcc034644ed4f8d733f842271ae4f738 18 28 58 51 79 80 116 31 21 52 22 8 91 222 68 7 29 59 21 113 27 30 8 201 33 55 126 21 179 130 2 105 42 26 20 164 39 20 35 226 55 54 12 80 146 31 37 13 7 41 102 66 59 27 7 54 61 19 42 33 48 18 23 +c597f2d54aeb3e059266a1e0d40783a6 17 47 12 9 3 27 66 7 5 16 11 6 3 11 31 0 5 0 12 5 11 0 11 19 6 5 47 14 59 0 12 5 16 16 23 11 12 4 15 2 4 10 15 40 2 15 8 26 15 3 5 13 14 68 3 66 5 17 29 13 0 5 7 +0ee4580d7d49d92213f411d4b7c58869 17 19 93 12 0 44 8 84 6 23 21 37 10 0 11 0 34 0 25 34 41 0 4 15 1 12 68 57 38 0 21 0 33 21 52 18 85 6 3 0 5 0 10 27 0 1 5 7 2 5 0 0 28 0 45 0 13 108 0 0 0 10 0 +803d49d027a781a00de6c92c9b93a353 17 18 89 5 0 36 0 97 5 0 7 17 13 0 0 0 6 0 69 27 33 0 0 0 0 22 133 8 113 0 4 0 12 17 32 19 14 4 16 5 0 0 13 26 0 0 1 5 0 6 8 0 35 0 2 5 18 30 9 0 0 0 0 +70756d316ad027f24915a9096b49cd1b 16 0 3 2 0 6 0 8 0 1 6 21 0 0 0 0 18 0 12 0 1 0 7 3 7 0 2 15 5 0 12 7 12 9 7 0 38 2 0 0 2 0 0 8 0 2 0 17 14 0 0 0 11 0 18 0 0 55 12 1 0 0 4 +4081a41d9b7a067e638b29cb85e67e5b 16 15 13 24 1 31 5 20 0 38 13 1 0 0 0 9 0 5 5 30 15 0 0 7 4 2 10 3 4 0 7 3 11 0 1 5 42 4 20 0 8 0 0 9 4 22 0 39 4 0 0 16 11 15 13 5 3 41 16 5 3 9 1 +622e1d7dd521747340af63ab0093fec8 16 12 60 4 4 2 0 10 40 6 5 0 9 3 18 0 14 0 15 97 5 0 18 0 0 10 64 9 53 0 2 2 19 68 34 19 63 3 2 0 0 38 40 72 0 0 2 27 15 14 0 0 2 0 0 4 0 0 43 3 191 4 8 +94ec5668ca04ce30c5bf4721c7ebd59c 15 13 12 7 3 21 23 30 5 8 7 10 7 3 7 7 2 15 24 31 5 0 7 11 3 14 3 6 9 2 8 8 10 27 4 10 24 4 4 2 4 9 10 19 3 12 10 7 6 8 4 10 15 9 8 9 4 37 5 5 11 2 2 +230a412288bddce55a91a912e03caf88 15 5 4 0 17 21 1 7 2 6 8 0 2 4 3 0 0 23 2 0 11 7 0 24 10 3 5 0 16 20 2 45 0 1 0 12 1 9 0 25 15 7 0 3 25 0 3 1 0 22 0 18 23 0 0 11 23 0 0 6 0 0 12 +42323aecd0e80d2a376dc751cd464858 15 0 19 0 0 25 0 44 26 0 5 3 0 2 0 0 16 0 20 0 42 0 1 8 12 0 9 13 4 0 9 7 19 2 3 0 8 0 6 0 2 0 25 0 0 15 0 9 12 2 0 0 8 0 10 0 3 7 2 5 0 1 9 +d455b51554f972f8dd205e2b3268bf0b 15 0 5 6 0 10 0 9 6 6 12 14 0 5 6 1 16 3 17 3 12 0 12 8 6 0 0 16 0 0 6 8 4 3 0 0 3 2 5 0 0 0 14 0 0 12 0 15 14 1 0 2 21 0 11 0 7 4 6 3 0 16 2 +b0189c9dd54e2ce117fa13b5ddfdd73d 15 7 7 6 2 5 3 12 5 9 2 3 0 0 7 5 19 0 20 12 9 0 20 5 1 2 11 11 17 0 4 7 11 6 3 10 16 0 0 0 2 0 11 9 2 8 0 9 13 3 0 0 8 1 11 7 12 22 10 4 2 5 0 +4d222250fab6894c7aea97b43865f96f 15 6 28 20 13 20 45 14 4 34 10 15 19 49 16 13 11 5 35 17 6 39 29 19 12 10 28 30 18 6 28 6 23 16 16 4 34 0 12 28 10 16 4 21 11 31 13 43 24 9 21 8 30 11 42 17 10 20 17 9 8 22 1 +1f717a7d0fb7582a3d356c2e012a61ea 15 32 37 55 5 112 1 90 32 48 49 22 0 5 78 0 45 6 61 88 75 0 69 5 36 0 11 56 16 3 2 21 38 15 8 19 143 6 26 1 29 0 83 9 6 18 1 123 50 19 17 6 56 11 14 9 33 207 17 13 1 0 11 +fec6e4757d8c0356f784d01b1000c264 15 0 50 6 3 0 10 3 6 6 13 0 7 6 0 0 18 0 111 29 8 0 0 42 12 8 40 17 43 0 0 4 26 15 16 11 61 0 10 0 21 0 30 68 4 2 9 15 1 7 9 1 31 2 1 1 10 10 16 8 0 0 0 +79687ef614af51265eff44be3c390d43 14 3 17 10 0 6 0 6 0 5 8 7 0 0 3 0 6 5 6 9 7 0 4 5 6 0 7 9 3 0 9 2 10 0 0 3 7 0 3 0 0 0 0 0 0 13 0 8 11 2 3 0 2 2 13 0 0 20 7 0 0 8 0 +672d411c1829d8c041dd17eb6f795544 14 6 6 7 0 12 2 19 7 3 11 19 0 0 4 0 13 8 3 1 5 0 12 6 9 0 3 16 6 0 6 5 11 2 2 0 7 2 5 0 5 0 3 4 0 8 1 4 6 4 0 3 5 0 20 5 8 17 0 2 0 3 2 +9fb459a9ebd9001b7e0239be515d7f13 14 0 14 3 0 16 17 33 0 25 4 0 14 2 0 0 0 26 3 0 27 0 0 0 6 19 38 0 38 0 0 10 6 4 3 0 0 2 0 11 5 0 0 10 0 16 3 0 1 0 9 18 12 9 3 8 34 3 11 0 9 0 0 +7e5ad4d8fe514b329a0bc74c7d882918 14 0 6 0 0 14 0 0 7 0 3 12 0 3 10 4 25 2 11 2 0 0 11 7 4 0 6 12 12 0 3 21 4 0 4 0 7 0 3 0 9 0 5 4 3 2 0 9 12 3 0 0 10 0 10 0 4 9 4 14 0 4 4 +c84d0652a8fd7a7f4b162dfd4d972a09 13 2 29 38 0 13 3 0 5 42 28 0 0 1 14 0 65 24 0 68 12 0 63 0 3 6 0 54 0 0 2 3 0 12 2 95 5 9 0 0 6 0 0 0 0 5 0 0 58 5 7 24 26 15 56 16 70 22 8 0 0 15 0 +bb5554ce020b07afa64285108fe3f8fd 13 3 9 4 0 22 6 16 2 5 9 0 0 4 2 0 2 8 3 4 10 0 6 7 3 0 3 15 0 0 0 2 11 0 0 0 9 0 2 0 4 0 11 5 0 1 0 0 6 0 0 4 14 10 12 11 3 10 0 0 0 1 2 +0a647047e467d4ed058cf5bf0957402a 13 3 11 18 69 15 0 20 0 34 20 10 23 5 3 3 18 9 24 12 24 55 8 26 16 13 46 20 42 0 26 25 20 17 12 16 21 4 13 2 49 22 4 14 35 13 19 17 26 4 24 14 12 3 7 4 21 28 29 16 5 6 24 +af0c1b108973651e93227c5300b52154 13 15 32 0 7 25 2 25 55 25 32 0 0 7 10 0 22 4 38 0 18 0 0 22 6 0 28 25 18 2 0 62 47 1 24 14 13 7 27 0 1 0 84 36 2 12 0 40 18 24 0 4 27 1 0 2 0 11 54 9 0 2 57 +1ba95e682975683dfae779b2c1c23b50 13 3 15 2 0 26 0 8 1 10 26 3 0 3 0 2 22 0 0 1 2 0 11 0 0 0 18 16 12 0 8 0 17 5 7 1 6 2 0 0 0 0 0 0 0 0 0 3 13 1 0 2 15 0 15 0 9 5 1 0 0 5 2 +1a48c5a6113d7c17dcc3064dd4018c47 13 17 12 2 0 7 0 8 21 1 4 6 0 2 4 0 3 0 6 6 9 0 40 1 0 0 32 10 18 0 0 2 4 11 8 2 14 8 2 0 0 0 25 10 0 2 3 2 24 12 2 0 3 0 13 0 0 8 2 2 0 0 9 +35185eb1a2e214d10dfcb00e1f830c28 13 0 23 38 15 17 24 8 0 19 9 13 6 12 2 0 10 8 8 20 8 0 0 45 10 4 18 10 29 7 3 4 13 9 9 19 15 0 5 3 10 6 1 14 3 12 3 1 2 3 10 1 8 0 1 3 12 0 2 10 3 0 12 +a6faf9461da2ef3d0a4033e981499272 13 51 37 92 28 69 114 75 22 89 26 30 9 18 56 2 9 26 18 188 39 0 13 65 28 11 70 8 57 25 9 12 36 17 18 52 47 19 22 26 45 24 25 29 9 46 17 30 5 38 54 60 49 66 27 82 20 83 20 11 35 3 15 +8182792128c0491d56c88dd07edd76fc 12 3 12 2 8 9 0 8 2 9 0 0 0 0 0 0 9 0 11 0 10 0 4 6 6 0 8 12 14 0 4 7 2 0 1 0 24 2 9 0 13 0 8 18 2 8 0 5 5 0 0 0 17 0 3 1 1 18 0 5 0 0 4 +639ae373d84c6d9e8c54e7c7737e12ca 12 1 15 40 0 41 0 81 14 26 16 53 0 0 0 0 11 0 14 0 50 0 6 4 4 0 28 12 16 0 2 2 8 0 0 0 22 0 8 0 0 0 11 7 0 1 0 11 5 0 0 0 27 0 15 0 9 79 4 0 0 5 3 +9c435eb8cd47bc655d21aa986119658b 12 0 9 6 0 11 5 0 0 12 12 13 2 7 0 0 17 0 23 2 0 0 27 5 6 3 4 64 4 0 50 0 5 7 5 5 4 0 5 0 5 0 0 0 0 66 0 10 51 0 3 2 4 2 39 4 6 3 3 0 0 10 0 +71aeb5bb3e746564373356395a45031f 12 4 10 11 29 6 24 13 0 7 20 15 31 41 2 0 36 5 3 4 6 57 6 27 16 7 2 34 2 28 17 10 7 5 7 8 13 2 6 9 7 47 0 8 21 19 22 0 4 3 39 18 11 20 17 14 4 4 8 23 18 7 6 +2223c7f7f844032df79e1bdc5294f7f9 11 0 10 18 0 33 0 1 0 34 32 17 0 0 2 2 4 8 18 8 2 0 0 0 0 3 9 4 10 0 0 0 28 6 13 4 10 0 2 0 1 0 0 5 0 1 0 10 3 1 0 4 16 2 2 5 9 44 6 0 0 1 2 +ae038c6562b145e35ad0318b39d6b4ec 11 0 9 12 0 13 0 0 8 18 0 0 0 0 10 0 13 3 23 0 3 0 7 5 5 0 7 7 2 0 0 2 4 5 0 0 15 0 5 0 5 0 6 7 0 8 0 7 5 3 0 5 7 8 18 0 8 21 0 1 0 0 6 +339783e9a5a778c3e5e4489560fd5334 11 0 13 12 1 21 2 19 3 15 4 4 0 0 2 5 10 3 10 8 6 0 13 8 1 2 4 8 7 0 6 2 9 5 0 0 10 1 19 0 2 2 0 3 0 13 0 0 6 0 1 6 3 7 7 1 4 16 0 0 0 15 5 +e9e9e37da589ce261910e5ccbfbdb669 11 0 5 0 18 3 0 4 8 0 0 8 1 0 0 20 12 0 39 0 2 0 4 21 6 6 16 6 22 3 0 19 0 12 3 0 8 2 19 0 25 0 6 22 0 2 0 0 4 4 0 0 11 0 7 0 28 10 22 25 0 0 27 +4d56e4f30f09408304c6122a85e23c0f 11 0 36 0 11 67 28 0 16 0 0 25 0 0 0 42 11 5 0 68 0 0 16 35 0 10 0 14 0 44 0 27 29 18 18 0 89 0 16 0 0 0 26 10 0 0 7 0 24 0 3 2 36 2 69 11 92 45 0 1 4 11 0 +32947c6041abff7011e105354f0b5225 11 7 23 8 42 22 4 8 11 0 14 22 2 3 14 2 34 20 24 31 13 0 24 17 21 17 14 16 34 45 4 58 14 15 5 15 30 18 2 0 29 0 18 36 24 8 5 25 11 27 2 21 36 10 20 16 24 19 20 34 8 10 20 +9f8b5a66114b158ea205d877a19bd983 11 79 60 0 1 0 219 3 0 5 12 6 52 44 20 0 3 51 27 59 0 12 0 45 0 81 52 3 71 0 4 5 37 106 40 21 29 50 7 61 0 91 0 113 19 6 52 0 2 0 88 105 0 58 0 77 47 24 59 33 220 0 0 +6ad306ab233e9249d93be970fa01086a 11 0 35 0 118 2 0 0 241 0 0 13 10 0 289 0 44 4 149 0 0 0 3 118 225 15 38 52 62 21 12 210 0 74 63 0 7 0 72 0 126 0 194 9 52 14 37 37 7 294 36 2 2 3 0 0 91 5 40 405 0 7 425 +e0d42f8ec45c0ab7ed7c4986967b3729 10 14 18 18 14 24 2 62 6 10 12 15 0 5 6 0 32 4 18 19 26 0 40 1 8 12 11 42 7 0 10 3 8 8 10 4 30 7 5 0 6 7 0 11 2 1 2 20 39 9 3 4 10 0 21 0 1 17 6 9 8 9 10 +0f0636cc5d527588b1ede4c7d2dde7ac 10 26 6 10 0 21 0 22 8 6 16 0 0 4 0 4 11 0 24 4 6 0 15 5 18 0 19 9 13 5 14 0 19 9 6 2 19 7 4 0 7 3 13 13 0 8 0 8 13 2 0 4 16 1 6 0 0 16 14 2 10 6 1 +01daaa2432645294954a0b76fdcbe7da 10 3 9 5 6 3 0 0 5 4 0 6 3 0 8 0 8 0 9 8 3 0 0 3 2 9 8 7 0 0 0 0 2 8 0 2 3 2 0 5 5 0 3 28 0 0 3 6 0 2 0 0 0 0 0 0 3 9 17 6 0 0 4 +23004b1488da6a0f0653663005635ba0 10 4 13 32 7 15 8 16 2 15 8 14 6 10 9 0 3 20 21 5 1 2 8 9 6 6 29 2 48 21 0 61 29 17 10 23 4 10 18 17 25 5 0 18 8 15 6 23 2 0 11 9 43 3 0 8 70 5 6 8 1 0 12 +db4007a9b47a221c6c888e1e566eadf2 10 5 33 7 9 16 24 11 12 6 8 34 7 0 7 1 23 6 36 36 3 5 10 10 3 6 11 12 2 15 7 0 20 0 5 3 33 1 26 0 9 6 6 20 6 12 8 27 3 10 17 7 5 13 11 17 12 5 0 17 9 9 5 +5fdc7f6c53a06a3b6c4d5162d53d6ca6 9 0 4 8 0 13 3 9 4 2 7 7 0 0 0 0 0 3 9 6 9 0 4 4 6 0 2 8 6 0 3 6 3 0 0 0 7 0 3 0 3 0 0 0 0 8 0 9 6 0 0 2 8 0 15 0 3 5 2 0 0 4 0 +adcbe2ea63f49b43717037769cf25cd5 9 5 23 30 42 29 13 18 57 21 3 0 11 9 45 56 10 43 20 46 15 0 0 14 10 12 57 11 36 6 6 15 25 0 3 24 11 3 39 22 1 0 63 25 15 49 0 62 4 47 21 72 7 85 13 64 0 40 48 37 2 1 14 +33d0febb94b246792f1aae0636efce29 9 18 7 8 0 17 48 17 10 10 5 12 1 0 15 6 2 21 6 9 6 0 4 11 2 6 34 4 72 0 0 3 4 7 4 20 16 6 3 77 0 1 1 21 0 1 0 9 2 0 11 25 5 32 0 36 6 16 34 0 4 2 18 +0cb2d9a70a5f30ed89dcd27351dec6ce 9 0 2 2 0 25 0 4 7 2 0 30 4 3 11 0 13 0 19 0 4 0 19 11 31 5 1 45 12 0 0 0 8 7 9 2 9 0 0 0 3 0 37 11 0 8 4 2 32 3 0 0 3 0 0 0 3 48 4 4 0 0 4 +7d09b4268f6eb7784b7b11e63c9840bd 9 7 1 8 0 32 11 6 1 4 13 3 14 8 7 12 13 15 14 23 2 2 6 6 0 29 3 5 22 1 2 19 20 15 4 38 1 12 2 0 5 15 17 23 10 5 11 16 0 16 6 39 29 14 8 17 33 0 35 10 13 8 0 +071b834220a13aec3f918e6d7c5c0fbe 9 9 0 14 3 31 4 35 0 28 16 0 6 6 0 0 13 20 6 0 14 0 2 0 0 6 22 11 30 6 0 14 11 31 0 4 11 3 0 19 0 12 0 6 29 1 3 0 7 35 17 14 26 6 7 21 18 17 6 17 47 0 7 +f23865630cfa351e81f3bdb8f02d2600 9 14 7 0 53 0 37 0 6 0 0 2 0 7 67 14 0 9 17 64 0 3 0 0 17 2 10 0 0 19 0 17 0 4 7 34 8 12 20 13 33 0 3 150 72 0 0 9 1 0 0 2 0 24 0 0 4 4 33 78 5 0 19 +cb34e7032d8beeb777aa7e8ca1f67af6 9 0 16 0 15 4 0 38 77 2 1 11 0 2 12 59 31 0 25 0 19 0 2 13 10 0 15 28 12 0 0 28 4 8 0 0 6 0 6 0 9 0 76 7 0 13 1 40 0 7 0 0 0 0 0 0 4 17 0 23 0 0 28 +4080622e7f2473518785a900c000796e 9 2 6 2 2 20 0 1 68 2 4 4 2 0 7 0 5 0 61 38 6 0 2 14 3 0 26 12 6 0 0 0 13 0 5 9 11 0 16 0 0 0 26 8 0 33 0 51 0 4 0 4 20 6 0 1 0 18 33 4 2 0 6 +ac46bb7a3052a33c6cf19f11949f9995 9 5 11 12 5 24 4 10 8 10 19 31 4 5 12 33 27 1 17 9 8 0 11 16 6 8 14 23 23 13 29 7 27 17 1 7 19 2 4 11 13 3 8 5 4 19 10 23 22 8 14 14 9 4 30 7 12 42 7 2 6 6 4 +8887b724c4807552f1e3459d132a5b87 8 5 9 11 2 7 4 4 5 5 10 5 2 0 4 10 9 5 6 8 6 2 12 3 2 4 4 8 9 3 5 14 6 5 0 2 9 5 2 3 8 9 2 5 0 14 2 19 8 2 0 6 4 0 8 6 0 8 11 7 3 0 3 +48b8a3d465e4112c012f44295820def6 8 5 33 0 0 5 0 12 20 1 16 4 2 0 2 0 8 0 10 6 12 0 6 0 7 0 9 13 15 0 11 19 35 0 37 0 28 11 2 0 8 0 0 13 0 8 0 4 2 1 4 0 10 2 22 2 6 32 2 1 0 7 11 +18980905b089a6bfc94e80973510a258 8 1 5 3 0 7 0 0 23 1 3 2 0 0 14 0 7 0 9 173 4 0 14 0 2 8 10 17 20 0 10 0 14 5 0 86 22 3 2 0 0 0 45 4 0 0 0 4 7 7 0 0 6 0 3 0 0 23 4 0 0 5 0 +0b207016fa82abecac687278b7de5cb2 8 3 10 8 5 41 2 4 1 26 8 4 2 0 8 0 4 10 16 6 4 0 9 9 4 6 2 9 9 5 6 13 8 3 4 23 7 0 0 0 4 0 7 4 2 11 5 13 2 0 0 15 19 5 4 7 17 15 3 0 0 0 4 +b3b6a724975532fd3ddcba0e4c717113 8 3 4 5 0 6 0 4 6 2 3 4 0 0 0 0 4 0 5 2 2 0 4 0 2 0 5 5 6 0 0 0 2 8 5 0 13 3 0 0 0 0 8 2 0 0 0 5 3 0 2 0 4 0 9 0 5 9 6 0 0 3 4 +768a62db52eb54cd2b8bafab6e2ea558 7 7 1 32 4 31 4 0 0 6 0 0 4 5 0 0 0 29 0 6 0 2 0 9 7 7 0 0 0 0 0 3 4 3 0 0 0 23 0 0 0 6 0 16 8 0 13 0 1 7 11 13 39 7 54 13 5 0 20 4 3 5 0 +13df7310f4f03d6565735e8eb7a04654 7 0 6 13 0 14 10 12 6 3 0 24 3 3 19 2 6 43 36 18 18 0 3 12 2 10 22 4 42 0 3 4 14 0 0 27 21 4 12 0 2 0 3 6 0 13 0 11 2 8 0 27 15 27 14 33 19 31 16 2 0 6 0 +5553b56f3e86ad68a42aeaced837ca04 7 8 25 10 2 1 5 0 11 17 4 5 0 0 3 9 0 4 8 17 0 0 0 0 0 0 4 0 2 0 3 0 5 7 7 14 4 8 0 0 0 3 5 2 0 20 0 9 0 16 0 10 3 3 9 2 0 0 13 0 17 0 0 +a8e48d5811dd332e63e5c266499d17bb 7 4 38 3 0 3 0 0 97 0 18 11 0 0 21 0 18 23 26 2 0 0 3 29 18 0 13 25 5 0 34 5 3 0 10 4 9 1 4 0 24 0 180 0 3 28 2 12 3 26 0 33 0 48 2 25 0 17 5 10 16 2 2 +ee97cc57c597d5a7b9ca8a63583e28fb 7 2 0 8 0 14 0 14 4 11 4 14 4 0 2 0 0 0 7 3 4 0 5 3 3 7 15 0 20 0 0 3 8 2 3 4 9 0 5 0 0 0 4 11 0 3 0 5 1 2 0 2 12 0 8 0 3 4 8 0 3 0 5 +a8b5c3c68456ae572c2ee42463063172 7 14 40 23 14 14 37 22 3 15 5 13 2 9 22 0 12 19 9 36 6 0 18 33 10 5 44 25 39 17 16 19 1 16 19 17 30 6 6 13 24 12 8 19 5 14 5 17 13 11 74 10 14 21 30 21 21 24 12 5 16 10 6 +6ba275c4f60bc54553c38d0064372587 7 2 0 12 0 22 0 4 0 15 0 9 2 0 3 0 1 0 4 4 20 0 0 0 1 0 14 3 6 0 1 0 9 1 0 5 2 0 1 0 0 0 3 18 0 6 2 2 0 2 2 1 6 3 5 0 3 8 0 0 0 0 0 +5ae3361a625d0fe05ff44ae2279b2ee4 7 2 2 6 2 7 0 19 6 11 0 0 6 0 18 2 12 0 10 9 14 0 0 0 0 12 9 9 6 0 0 2 6 14 0 8 8 4 6 0 2 8 1 7 0 0 0 3 0 0 2 4 3 2 0 2 3 16 8 0 9 0 4 +ad6caadb0216fd4ef937dca5be8538af 7 0 15 10 0 4 0 5 3 7 0 6 0 0 0 0 4 0 4 4 4 0 2 4 2 0 5 7 3 0 10 0 5 0 2 0 4 0 6 0 0 0 2 0 0 3 2 3 5 0 0 2 5 3 11 2 0 6 0 0 2 3 2 +b72a6eeeb3bb6ad8565e67d0518a1431 6 10 0 26 0 10 60 0 0 10 2 0 0 0 3 0 0 4 0 0 0 0 3 1 1 2 7 0 10 0 2 0 6 7 1 4 2 1 0 6 2 13 0 7 0 0 1 2 6 1 1 7 2 26 0 21 0 0 6 2 1 0 2 +9d5e9f0495eef7e9b0a5160558ec08c7 6 0 95 0 2 2 0 0 92 0 7 17 3 0 13 4 7 0 34 3 0 0 0 0 3 14 22 3 24 0 2 12 6 25 58 0 43 0 0 0 0 0 127 13 0 0 0 30 0 32 8 0 3 0 2 0 16 0 8 9 0 6 13 +cedd8c9eccd9774d3acdd5b747baf77b 6 0 0 17 9 12 8 1 0 31 12 36 5 4 4 2 0 10 0 9 0 0 1 44 3 9 22 0 21 15 7 4 63 0 5 20 0 4 7 9 0 2 0 7 0 9 3 6 0 5 0 20 0 6 15 8 5 60 0 4 4 3 2 +28f3177099f0c516bfd4aa5a23d4b233 6 10 0 0 24 0 8 0 12 0 0 9 37 3 64 1 0 17 0 10 0 33 9 13 2 38 45 0 53 7 0 8 0 40 0 11 0 5 0 116 0 24 64 3 40 0 47 0 13 84 28 23 4 9 0 26 25 0 11 32 57 0 4 +481c451b792f224d685c7047bc9fe237 6 10 0 3 35 14 6 3 3 17 0 2 12 6 26 0 0 15 9 7 13 0 0 9 2 28 11 0 38 9 1 3 6 30 0 18 1 8 2 27 0 2 9 24 7 0 3 0 0 21 0 7 13 6 0 9 0 5 35 10 2 0 35 +cf7055b2133f124bfa69f5ae37a02b1e 6 15 6 16 0 90 80 6 3 25 17 42 5 7 0 0 2 21 6 0 21 0 27 33 5 6 30 9 29 0 70 2 4 17 53 11 4 0 2 0 15 0 2 3 0 8 0 3 98 5 0 17 30 115 18 96 3 6 2 2 0 16 3 +d7b3981c6be9dde250f919885ecf4b5a 6 4 23 17 2 5 3 9 6 16 6 17 2 0 12 0 3 0 19 14 9 0 4 0 7 6 19 5 18 0 3 3 5 10 4 13 17 5 0 4 6 9 8 13 0 0 3 5 2 8 0 4 7 0 13 0 12 25 5 3 15 0 7 +97fa327269f6189b4b8796ad31d3cf6c 6 20 7 0 1 2 0 0 36 11 2 15 0 3 3 1 9 1 35 7 0 0 8 4 0 0 18 12 24 0 0 6 18 4 2 21 6 11 0 0 0 5 46 28 0 6 5 33 15 4 0 2 0 1 1 1 0 4 20 7 10 3 5 +c6b97d2a028cba3362396f0ba25d14d4 6 7 18 1 0 0 0 5 0 8 21 0 1 0 2 5 0 19 10 51 1 2 0 0 0 0 51 0 56 39 0 3 0 0 0 54 17 2 14 8 5 10 0 23 3 19 0 0 0 0 10 14 2 13 0 5 57 16 3 0 5 0 0 +7df678d822963c19b1185033d578bac4 6 41 30 8 39 15 2 18 13 12 51 0 7 8 11 0 26 16 39 60 14 0 1 49 42 6 0 21 0 73 12 21 9 15 34 20 11 18 11 0 76 0 9 2 9 45 3 16 0 16 0 20 11 24 7 28 7 15 0 20 0 0 32 +a28cce2b918db788ef4815f68a24729c 6 99 31 52 60 92 124 64 0 63 37 5 27 21 96 0 7 64 29 160 48 4 0 148 110 62 17 3 16 86 1 50 6 50 10 74 0 26 12 126 129 39 32 182 27 28 13 21 0 112 268 118 68 130 5 115 69 52 23 45 48 0 61 +ea0ad43caa7f67a9380bf14003120911 6 41 15 63 34 63 94 19 5 26 26 20 43 39 48 47 6 152 10 29 25 17 13 65 34 47 35 0 62 95 5 108 20 33 4 39 14 21 16 89 46 26 10 19 27 24 72 19 12 48 47 83 35 74 11 90 106 27 19 25 23 2 29 +213fe252a1397972feef6b57e2d4f6f7 6 0 4 23 0 32 15 3 2 40 12 6 0 3 4 0 1 8 18 55 1 0 2 4 3 2 5 5 5 0 0 0 31 0 3 32 15 3 7 0 5 0 11 11 0 21 0 13 12 0 0 25 14 17 7 18 5 5 8 5 0 0 1 +0dbde09ad53cc6ef85a86875199a19f9 6 0 10 4 0 5 0 49 12 9 5 0 0 0 0 0 6 0 15 31 35 0 6 7 19 0 11 6 13 3 0 8 31 0 7 7 118 3 8 0 10 0 11 8 0 5 3 4 8 5 0 0 7 0 0 0 4 4 3 3 0 0 0 +499ffc0e61dea1d304d28d7ca5a21ecd 6 17 0 13 0 6 0 10 7 12 0 8 0 0 16 0 10 0 9 3 6 0 10 0 2 2 10 15 9 0 7 0 0 1 1 6 9 4 2 0 0 0 0 8 0 0 0 8 9 0 0 0 1 8 2 5 4 13 2 1 1 4 0 +f8e11ec1df9c2821ff717226c8825fe6 6 2 16 4 5 9 0 8 0 17 6 18 2 0 10 0 0 0 8 3 9 0 13 11 2 0 25 0 3 2 4 3 11 2 6 0 4 2 0 0 7 0 3 6 2 6 0 11 3 4 0 0 4 0 26 0 5 20 22 0 0 3 0 +335c5cfa35eab4d46bf835889f22104a 6 0 27 15 2 72 3 23 14 13 0 0 8 1 0 0 4 10 47 41 14 0 15 26 0 0 15 1 11 0 0 2 41 5 7 22 20 0 15 0 0 0 29 10 2 2 7 37 9 1 2 7 39 2 3 1 17 47 10 0 0 2 3 +6efb7517aa55acd843d2dc13811b7727 6 0 9 14 0 13 6 6 0 6 4 2 0 0 0 0 9 9 4 6 3 0 0 2 2 0 0 5 0 0 8 0 13 0 2 0 5 0 9 0 5 0 0 9 0 4 0 3 2 0 0 14 10 12 16 13 8 13 0 0 0 2 5 +dd75d06ce5522cf6632528dc4b277d7f 6 6 12 5 0 10 7 10 4 8 13 9 0 2 4 0 4 0 6 7 5 0 22 0 0 4 17 6 15 0 28 0 9 14 4 7 32 2 4 0 0 0 0 6 0 7 0 8 20 2 0 0 6 0 37 2 1 9 6 0 0 7 0 +a31e0da750e835e973e0bf4e91f95056 5 1 39 0 9 7 4 118 15 1 17 0 3 4 3 5 8 0 38 12 71 0 3 26 16 3 21 10 29 0 16 27 18 21 6 7 27 0 16 0 8 0 10 13 10 26 3 48 7 19 0 0 2 0 0 0 11 24 23 25 0 0 23 +f503b412f2a70ac361ded3a91ecc3db2 5 11 15 9 8 8 65 13 0 15 6 0 4 47 0 0 0 15 0 12 6 1 0 23 5 6 0 0 1 44 13 19 0 4 8 13 0 5 0 13 42 14 0 0 6 4 6 0 0 3 4 23 5 28 11 43 1 0 0 6 20 8 6 +b7706b2c815a301a31bf0dc10fecb217 5 10 20 12 7 31 0 82 20 10 19 6 0 4 1 0 8 2 0 0 61 0 0 20 13 0 12 14 3 0 6 13 16 0 12 4 70 8 5 5 14 0 12 18 0 0 0 4 14 0 6 0 20 0 9 0 18 18 0 2 0 0 21 +24c73a01654c8c3830044d482585ef88 5 4 0 4 0 11 0 18 8 12 5 6 2 0 0 6 12 5 4 6 11 0 1 0 3 3 1 2 0 0 6 3 11 7 4 5 9 0 4 0 4 3 14 4 0 8 0 0 4 6 0 2 7 6 7 3 2 4 4 5 6 2 7 +4efca9989527f8b802e61cb9dcffe7af 5 7 13 19 0 9 38 11 3 22 12 7 44 97 19 0 0 4 17 16 18 28 5 17 18 15 15 11 17 11 11 14 6 10 17 7 11 5 11 52 42 0 2 11 6 11 10 4 5 5 9 2 9 13 19 4 10 10 11 2 12 7 6 +5c443e8f2ace2fdd10ab3322c64a679e 5 11 8 0 23 0 1 0 133 0 2 6 0 0 125 0 0 3 83 21 0 0 0 21 50 3 28 0 25 4 2 14 0 5 4 29 0 11 15 0 26 3 144 50 26 66 0 79 0 32 0 5 0 5 0 5 0 8 22 116 2 0 33 +9530e60ff8739acc48189870acadc694 5 2 2 9 7 8 3 7 8 6 12 6 0 0 0 7 0 0 6 0 16 0 2 0 3 0 0 5 0 0 19 0 3 5 0 2 0 0 5 0 6 1 0 0 0 14 1 10 5 0 0 3 0 0 10 5 0 4 8 0 0 14 3 +36651e7ddc084c10bf7a1f8bcfb86e02 5 0 5 2 0 42 1 17 0 7 0 41 7 0 4 0 37 0 37 0 12 0 4 0 2 18 18 31 21 0 7 0 0 16 6 4 5 0 15 0 0 0 0 0 0 9 1 21 9 0 11 0 34 0 9 0 22 3 2 1 0 0 0 +8ad328e087a52f8c01c25dacaff8ef34 5 6 15 7 0 15 0 0 41 9 13 6 0 0 5 0 11 2 18 5 1 0 29 2 0 0 7 21 6 0 8 5 14 2 4 3 26 0 0 0 0 0 38 6 0 4 0 23 26 0 0 8 11 5 6 3 2 6 3 0 0 1 0 +6505fb8d404480f6a17612e90a8483bc 5 9 14 5 0 3 0 35 0 8 15 0 0 2 2 0 0 0 1 13 14 0 9 2 2 0 21 2 17 0 1 5 9 9 4 7 10 1 5 0 0 5 0 7 0 0 0 0 2 1 0 0 4 0 5 1 6 6 3 12 28 4 4 +f8a10260b9f3daa3ac7284c80ad6e264 5 8 11 8 6 14 0 13 3 13 3 0 6 0 3 3 5 0 23 6 11 5 5 5 7 17 12 9 7 0 2 4 0 8 3 2 8 3 0 2 0 10 4 5 0 2 16 0 0 2 6 6 5 4 0 3 6 0 8 0 14 0 5 +644b1c93e9824246cac1305c5555b79d 5 13 15 20 42 48 51 16 7 17 10 5 18 146 9 19 0 26 12 78 20 11 1 78 6 22 61 0 89 78 1 46 13 23 7 37 34 16 18 210 25 74 10 39 103 3 19 18 10 43 22 15 28 11 0 22 10 1 47 25 62 4 9 +5a41c6b926b83eff8ffae03d6c449a60 5 3 3 7 6 11 0 2 5 1 10 5 0 4 0 3 13 0 11 0 3 0 10 5 3 0 2 7 2 0 2 4 2 8 0 0 6 6 2 0 8 0 3 5 0 4 2 11 9 4 0 3 7 0 9 2 4 6 3 0 0 0 0 +eee3bead66f12ab150f9b24d6978242c 4 0 8 2 0 3 11 2 13 2 4 6 0 0 1 0 2 8 6 8 1 0 0 4 1 0 0 8 2 0 2 2 14 2 9 0 19 0 4 0 0 0 8 2 0 8 17 4 0 0 3 6 2 17 2 10 16 53 0 0 0 0 0 +ba7777179eeb996c78400dc8e9012862 4 9 6 24 0 2 0 13 4 23 8 2 2 0 11 2 0 13 6 23 15 0 4 0 0 7 26 0 20 0 0 4 1 16 4 17 4 7 10 0 0 0 3 2 0 0 2 10 6 0 0 14 9 22 0 12 0 0 10 0 0 0 0 +7bc4d7c42ac863626e69cd7e291e5622 4 13 10 2 40 15 9 2 2 4 6 2 30 66 14 0 3 4 13 7 18 5 0 65 27 25 28 1 28 50 0 11 7 17 5 19 9 3 2 50 31 20 6 6 47 5 36 0 0 20 13 0 0 5 2 4 14 0 11 26 0 0 13 +96f7f0f46bb5f1697fb22bd0eeac2d29 4 7 3 0 8 2 0 2 0 0 1 2 53 2 17 18 0 0 6 3 0 36 4 2 1 13 35 2 5 0 0 3 3 5 0 0 39 2 5 6 0 19 0 23 6 0 14 16 0 26 10 0 0 0 0 0 11 0 27 7 2 0 0 +0ee8c241ec8d81255d9455f15d2f474d 4 3 4 4 3 3 2 4 5 4 3 5 0 0 3 0 0 4 3 15 7 0 3 3 0 4 2 1 7 2 0 0 4 8 2 7 5 0 0 0 0 5 3 5 4 3 17 9 3 0 4 8 0 0 4 4 0 2 3 1 0 0 0 +e9590dfeddfeba4c29b9475cbdb1104e 4 3 10 3 12 3 0 2 3 0 14 10 2 0 7 0 3 0 3 1 5 0 0 9 4 11 14 4 12 2 3 8 6 8 2 8 3 2 5 3 12 6 2 0 4 2 6 3 0 2 2 3 4 0 0 0 7 2 2 8 0 8 5 +93ef4d133f164f367b3aabe5242a4175 4 2 4 2 2 0 3 0 0 0 0 0 0 3 6 3 4 0 0 7 4 0 2 4 2 0 8 0 14 0 0 5 2 10 5 2 0 0 3 3 2 0 0 4 0 1 3 8 4 0 0 2 1 3 0 3 0 7 6 4 0 0 2 +a4ddf3a82cec8155bbb3ec0f61ffe5a5 4 2 3 4 0 3 3 1 6 2 3 0 2 15 3 2 2 0 12 16 0 0 0 43 0 0 1 0 0 3 0 2 2 0 1 6 10 2 0 3 1 0 3 9 0 0 1 5 0 6 0 5 0 1 0 3 0 0 0 0 0 0 0 +7bae3a3abccf601d92052bf798245948 4 13 0 15 7 8 47 7 0 5 7 0 14 34 12 2 0 61 0 4 0 19 0 21 3 8 0 0 2 0 0 12 7 1 2 13 0 16 0 19 0 35 0 4 10 0 7 0 0 7 30 33 11 15 4 28 25 0 6 0 7 0 1 +5265913f4eb53ad82b70504cb29fcadc 3 0 0 3 0 3 9 3 0 2 3 2 1 0 0 0 0 7 0 7 2 0 6 3 0 0 16 0 9 0 0 0 5 5 3 4 2 6 2 0 0 0 3 0 0 5 0 2 0 2 2 21 6 6 1 7 1 5 4 3 0 0 0 +6b36abe3084277fce99322890e5954be 3 0 2 4 5 3 37 4 3 7 0 10 25 23 1 2 0 4 9 17 2 12 0 18 0 24 3 0 0 2 4 0 13 0 3 11 7 0 6 40 11 29 5 9 15 3 9 2 0 6 17 10 3 17 0 16 3 29 14 3 25 0 1 +39b33ce40ebece11cd23a71e0f4d00a8 3 21 0 4 16 17 170 0 0 7 3 0 11 18 0 0 0 16 0 17 0 0 0 29 6 12 0 0 11 0 10 0 0 12 0 3 0 10 2 0 26 0 0 0 5 18 30 0 0 22 23 27 9 70 0 44 3 0 3 20 0 0 8 +26a6c6e69494118f0e0f558c7a5e3276 3 8 5 22 5 15 10 22 5 12 39 0 0 2 0 2 0 17 5 58 16 0 3 4 2 2 18 0 18 22 0 21 3 10 2 20 2 5 23 0 6 0 0 8 0 2 2 0 2 0 4 7 8 13 0 17 4 28 8 0 3 0 6 +55a6ae48e1fb440c3bb6e2df64d93d2b 3 3 5 22 3 27 9 27 6 13 3 5 2 7 5 0 10 9 4 19 7 0 17 14 2 2 4 12 7 3 5 5 8 2 0 9 14 0 10 10 5 0 5 5 0 3 2 8 7 0 9 5 26 7 17 7 15 34 5 0 0 0 7 +5b9d7b869352c33cdd9cd029e3e68a9d 3 2 3 12 6 4 0 0 0 2 2 6 0 0 0 0 2 0 5 4 2 0 11 2 0 0 4 0 24 0 2 11 4 2 2 10 2 2 0 0 4 3 2 17 3 3 0 0 10 8 3 0 14 0 2 1 12 14 7 0 0 8 0 +c18875043eab7b5b4974be9724aa4f91 3 5 2 0 7 3 0 2 8 7 0 4 0 7 4 0 2 2 11 4 2 0 9 3 3 3 11 0 4 6 0 4 9 3 0 4 5 2 0 0 2 7 0 5 6 2 0 4 8 12 3 3 4 0 0 0 7 6 0 1 5 0 3 +bff8ba4ec472073f1a32b295ba50b700 2 0 0 3 5 4 5 0 5 0 2 2 0 3 7 0 2 0 0 5 0 0 0 4 0 3 2 3 3 11 0 2 2 0 5 2 4 0 2 5 5 0 7 4 0 2 2 0 2 3 3 4 0 8 0 23 2 1 3 4 0 0 0 +bded0f50cd0a3b8caffd8b5c6a03a08e 2 0 0 9 0 3 3 3 11 0 0 0 0 0 32 0 0 3 15 6 1 0 19 4 9 0 12 8 6 0 0 7 13 0 0 5 9 0 0 0 1 0 30 3 0 2 0 4 13 19 0 5 9 5 2 2 0 0 7 5 0 0 5 +7e8d6c9be71671641f0177738bd4bbf8 2 13 5 23 0 5 0 19 11 20 0 0 2 0 10 9 0 6 0 375 10 0 8 0 0 0 14 0 24 0 0 0 0 35 4 149 26 12 0 8 0 17 9 25 0 0 0 2 2 18 3 6 6 7 0 8 12 0 12 0 47 0 2 +958a6745bc4b7fa1769d256880e19e31 2 4 3 5 0 2 6 6 2 4 2 0 2 0 0 7 0 0 3 0 6 0 2 2 0 0 9 2 5 0 0 2 2 4 4 0 0 0 0 0 7 4 3 3 0 2 0 0 5 4 0 0 5 0 0 2 0 0 9 2 32 2 3 +399037fa1d8b3180899db74ab936d266 2 9 2 5 8 0 0 6 7 7 10 4 3 0 8 0 0 7 5 13 8 0 0 7 0 9 10 0 5 3 0 3 5 6 0 9 0 11 3 0 2 25 4 0 2 18 0 12 0 11 0 11 0 6 0 5 0 0 6 0 35 0 2 +64204646d287853abe829aa1da6a09ac 2 3 7 2 9 3 4 0 0 1 8 0 0 11 1 0 0 4 0 4 0 3 0 7 0 0 1 0 3 8 0 16 4 3 0 1 4 6 2 3 2 20 0 4 11 2 5 2 0 2 7 4 0 5 2 0 5 0 2 10 8 0 5 +56231e13c5d1301dc6d0c083640c8464 2 7 3 16 0 26 43 0 2 5 2 1 17 56 9 2 0 34 0 2 0 37 0 64 17 19 4 2 20 29 8 24 2 3 7 28 3 19 12 41 55 26 0 16 41 12 32 0 0 38 18 25 6 12 3 33 42 5 13 30 4 2 9 +818a9bda59af5db0667383cfa94e9bfd 2 9 8 3 0 4 0 19 8 1 10 4 0 0 0 0 11 5 6 4 24 0 11 0 4 0 2 8 3 0 0 0 7 0 0 4 0 2 2 0 0 0 5 0 0 8 0 8 15 0 0 0 1 3 0 4 7 2 5 2 0 5 0 +27912779a538e8f80fabf0adfc183fa1 2 17 0 2 37 0 9 95 0 4 20 2 6 0 0 1 0 12 0 5 80 2 0 4 5 5 0 0 0 0 2 0 13 46 0 0 0 6 0 0 3 17 0 2 7 3 2 6 0 0 4 19 0 24 2 17 0 0 16 6 65 3 18 +785941e2da0fce36077a39b81f00ec99 2 2 0 6 2 0 3 9 2 4 11 4 0 0 0 2 0 0 2 16 5 0 0 2 3 2 6 0 5 0 0 3 3 3 2 4 2 3 6 0 3 2 2 3 0 6 2 5 0 2 0 2 6 5 0 2 0 7 5 0 7 0 1 +81779da94b6a248f604ce0d304ddae1b 2 13 13 54 0 20 14 1 0 28 16 0 0 14 0 0 4 10 9 0 8 0 0 0 1 3 19 11 24 0 0 0 14 6 6 5 37 2 0 6 0 3 0 7 0 11 7 0 0 0 0 10 9 16 1 9 0 24 0 0 2 0 0 +6b8299f4df592dc706235e0810c03884 2 6 18 15 16 15 3 55 11 17 18 6 0 10 9 0 11 1 11 44 37 0 31 11 9 5 11 19 6 29 7 2 10 2 6 14 21 4 9 0 7 0 13 4 11 9 0 3 22 2 0 4 3 0 21 4 6 17 3 10 0 18 8 +8e25a400144381e0c1aa2fbd323135eb 1 58 116 50 15 9 36 18 0 49 100 0 18 0 0 0 0 0 13 80 36 0 0 0 0 30 59 0 26 2 0 4 0 26 60 41 35 25 13 2 3 31 0 17 23 2 7 12 0 0 10 0 6 0 0 0 0 41 15 20 45 0 12 +75dcf88a354cf2b7aa5ee780bd34cdfb 1 7 0 2 3 5 10 1 0 3 0 0 17 52 0 0 0 7 0 0 2 16 0 40 0 8 6 0 0 4 0 0 1 1 0 5 0 1 4 39 0 24 0 7 44 1 11 0 0 2 8 0 5 13 0 0 3 0 0 13 0 0 2 +15401e605bc62331aca5f6fb7e96497d 1 3 0 7 3 4 8 7 0 5 3 0 3 2 0 0 0 2 4 6 5 0 0 8 6 12 20 0 15 7 0 4 0 8 3 4 4 8 2 0 9 3 0 20 2 0 8 0 0 19 0 6 3 4 0 4 3 2 0 7 27 0 8 +f0d034f449b84a3fa931b4f32f9a93d6 1 7 10 2 3 1 7 1 0 3 17 6 5 3 5 5 0 5 2 4 0 0 0 3 0 8 3 2 0 8 5 5 5 6 5 2 3 0 6 0 3 0 0 15 0 3 3 2 0 8 33 0 0 7 0 10 9 12 0 1 0 0 2 +d8d51ea67086c3a8a6f363b6b0a973fe 1 6 12 0 27 30 9 0 0 13 14 24 33 14 0 0 2 2 16 4 0 14 0 1 18 2 0 7 0 28 2 0 16 0 10 0 5 7 2 0 30 7 0 9 35 22 13 3 0 4 0 0 3 0 0 5 0 13 0 35 3 0 4 +ef94fed35adeec089fb1a66ff6354baa 0 81 34 0 70 72 23 42 5 6 31 0 101 73 5 0 1 0 19 50 37 9 0 108 13 248 48 0 37 39 25 5 2 151 24 34 0 21 8 28 27 24 5 0 31 58 114 0 0 104 56 9 36 8 0 2 35 0 17 45 12 2 18 +ea1580f6a3293a8aabb6db73b098a7d2 0 61 7 3 80 6 29 9 0 3 47 2 64 9 1 14 0 35 0 3 10 7 11 41 20 12 0 0 0 34 10 13 7 10 8 5 2 14 2 16 70 66 0 31 32 53 23 0 5 23 0 55 0 42 25 33 3 0 8 25 52 0 22 +7e8cf5b06bf581d09fb7af9366f79a59 0 50 19 53 7 51 51 49 0 68 26 10 12 25 5 0 0 64 6 145 35 4 1 32 0 32 49 3 28 0 0 0 28 13 11 58 42 19 22 94 0 17 0 14 0 8 4 7 8 2 160 103 16 135 0 102 24 71 13 0 15 0 3 +a42fe64fe9eafaa498536134322cd270 0 34 16 2 49 3 8 9 0 18 27 0 145 167 1 0 0 13 0 13 10 206 0 74 37 47 0 0 14 159 28 32 4 19 8 18 0 12 1 35 61 150 2 12 192 22 66 0 0 28 11 16 1 6 14 24 11 0 4 73 27 0 23 +fc5db53e9f3749cd729663bddc133531 0 30 0 2 47 0 17 49 2 20 52 0 3 0 0 20 2 29 10 37 49 2 0 33 24 13 0 0 0 26 44 12 0 49 0 23 0 0 0 0 37 82 0 0 18 10 16 3 0 31 13 21 0 32 0 22 13 0 0 26 118 14 28 +43357262c3e0a802c033c7ddc81c5217 0 30 15 4 0 0 366 1 0 3 6 2 0 10 0 4 0 17 0 21 0 2 4 5 0 5 78 0 42 8 3 5 6 4 10 13 0 7 8 27 0 0 0 6 4 31 16 7 0 0 8 23 0 24 24 9 4 0 9 5 3 10 0 +9f29506ddee56d4ac22bf0ab082334c9 0 30 16 11 51 4 51 23 0 2 36 0 30 0 14 0 0 21 0 109 15 0 0 52 15 44 31 0 17 137 0 53 0 13 7 57 0 17 12 0 41 10 0 0 21 0 8 0 0 0 20 29 2 53 0 19 0 0 0 38 35 0 16 +210f180ab2064478a8656badbee76bcf 0 30 0 19 5 6 33 20 0 40 0 0 9 207 0 2 0 0 0 0 25 8 2 31 0 13 48 0 65 13 0 9 32 6 10 13 10 6 0 266 0 94 0 7 10 0 5 0 0 0 3 0 5 0 2 13 2 0 8 12 56 2 6 +797fa319cf5965a151ecd64f4343010e 0 28 9 2 37 0 9 4 0 7 8 0 16 11 2 8 0 16 0 11 1 9 0 27 7 6 4 0 6 8 7 9 5 20 11 15 3 13 4 10 19 38 0 10 38 6 5 4 0 9 8 30 0 21 3 14 0 0 8 41 22 0 6 +52ca91849fcbee4de308b851653577e5 0 27 5 0 19 31 66 5 0 8 0 0 36 48 117 0 0 27 0 7 0 0 0 39 10 40 23 0 17 26 0 1 9 56 4 4 16 7 3 84 34 7 0 0 6 0 1 0 0 28 0 0 4 53 0 26 2 0 27 0 19 0 14 +048c69711ef5b8485f019a3b6efbe609 0 26 9 21 17 7 8 0 0 51 13 4 13 4 11 7 3 6 4 24 0 23 3 5 4 22 13 2 21 13 0 0 6 27 10 13 6 12 4 5 2 25 0 14 20 13 21 22 2 27 12 14 2 11 7 1 19 0 7 8 29 0 4 +dd9f6918468c87092ce247b5fb13ea38 0 25 0 24 6 0 18 0 5 25 3 0 2 0 0 0 0 27 0 32 0 0 5 11 18 6 23 0 5 4 0 15 0 8 0 23 0 21 0 6 16 16 0 0 0 0 13 0 0 21 1 17 0 31 0 26 0 0 1 3 51 0 8 +30dbabdea101dca267c28e300214bace 0 24 6 5 20 0 6 9 0 6 37 0 38 58 0 0 0 3 0 28 13 6 0 28 3 33 0 0 4 12 0 6 20 5 4 20 2 7 6 2 7 29 0 10 43 5 2 0 0 9 21 5 0 14 0 5 2 0 30 32 32 2 10 +521119ead02c34e80b3163ee908f55ce 0 23 0 3 14 0 44 21 0 10 22 0 6 4 0 1 0 33 0 30 9 0 0 24 50 13 3 0 1 13 35 9 0 1 0 10 0 6 4 0 39 0 0 0 12 7 4 0 0 0 4 68 5 89 19 52 9 7 0 34 3 4 11 +22c72bfb78ff51e30134e49d231837e6 0 23 2 9 22 5 19 2 0 11 13 0 10 62 5 2 0 23 0 0 10 13 0 48 6 6 2 0 3 17 0 17 3 1 0 11 0 34 5 22 19 43 0 4 35 1 5 0 0 11 2 27 4 7 2 12 7 0 6 22 4 0 7 +cc9da89833f061d245dba64d52341874 0 18 0 27 0 1 205 0 0 36 11 6 50 60 7 0 0 46 0 20 0 7 0 6 0 115 39 0 21 0 4 0 19 86 9 2 7 14 0 76 0 81 0 0 15 23 7 0 0 7 140 63 2 112 0 75 27 0 0 6 125 0 0 +70a8d1c4be3e97092fa67ac6382aa787 0 18 2 26 10 50 4 16 9 18 11 0 1 0 41 0 0 1 28 52 7 0 0 19 0 29 29 0 38 0 0 0 0 22 2 30 28 6 7 0 4 0 9 17 0 22 15 18 0 16 0 2 26 0 0 3 11 6 3 16 0 0 6 +11dbeba7710fb2bbdf10c47c7b8d5e04 0 18 19 0 0 13 39 3 0 4 0 13 36 140 10 1 0 39 0 34 3 123 0 27 0 31 29 0 32 21 0 4 18 8 13 0 0 2 12 87 0 27 0 46 23 15 84 0 0 13 8 38 0 31 0 54 35 0 5 0 30 0 3 +93180572f47df5696442b25625397abe 0 17 1 0 4 0 14 0 0 3 4 7 6 9 0 2 0 0 0 4 1 10 0 11 6 3 2 0 2 5 0 0 0 0 1 3 0 0 3 0 8 0 0 0 4 0 9 0 0 8 7 9 0 11 1 3 1 0 0 4 5 0 4 +12b7436a9bd8d94179622eb96f2a1e9f 0 16 33 24 10 14 5 4 0 15 29 0 0 0 0 0 0 9 0 30 17 0 0 14 12 0 17 0 14 7 0 11 0 2 26 20 4 14 3 0 19 0 0 0 0 0 0 1 0 3 0 17 0 12 0 5 6 23 0 9 0 0 17 +5917add9cc2eb7627211cb5f4fc686f6 0 14 6 3 20 0 12 0 0 4 0 0 51 24 3 4 0 4 2 7 2 50 0 6 4 13 9 0 3 7 0 8 7 7 3 0 0 2 0 40 0 36 0 4 14 0 52 0 0 7 30 3 0 1 0 0 0 1 2 24 16 0 3 +17b301b6236fa45dd9183393bfaed922 0 14 2 7 26 3 29 0 0 13 11 0 22 32 0 2 0 14 0 0 3 20 0 15 7 12 0 0 5 16 2 3 4 2 2 7 0 6 0 21 12 16 0 7 25 4 22 0 0 3 8 14 0 8 0 9 3 0 3 23 6 0 3 +4a85247e9339be3d8a17ac8c90d2541b 0 14 9 51 58 63 101 22 5 53 30 0 12 87 26 26 3 25 0 5 35 0 0 92 6 25 14 1 18 17 0 40 53 89 10 14 5 24 2 0 20 28 11 45 61 5 35 21 0 35 7 33 59 5 0 21 15 0 27 42 27 1 33 +4857950416ad9a79a28812d6915c2d5c 0 14 3 4 3 4 32 3 0 2 7 2 5 6 0 0 0 20 0 38 0 0 2 5 7 0 7 0 7 33 0 3 2 0 0 13 0 2 0 8 18 3 0 0 3 0 2 0 0 2 2 25 0 36 0 24 0 0 0 4 2 0 0 +6dc83dc414d91ff94a62a1cef2203350 0 13 0 6 2 7 25 0 0 4 8 0 0 1 4 3 0 47 3 5 2 0 2 5 0 6 2 0 15 0 0 5 9 4 0 16 7 9 2 3 6 6 5 13 4 0 0 6 0 3 1 20 21 9 0 17 3 0 17 1 2 5 9 +002a55f8939d89bbc9f18f10149a8c65 0 12 2 4 0 0 52 0 2 2 5 0 1 2 9 0 0 14 4 18 0 0 4 3 2 3 6 0 10 6 0 5 9 11 0 13 11 5 2 15 0 3 0 33 2 0 0 4 3 3 0 26 2 9 0 14 0 0 43 0 16 0 0 +ad074a7b833799e333fb725ba35eb25e 0 12 10 12 18 5 221 0 0 15 25 0 0 77 14 1 0 52 0 9 6 0 1 10 2 0 45 0 60 13 0 3 0 99 12 5 8 9 6 140 26 23 0 50 44 54 0 0 0 13 34 39 0 28 0 27 2 0 41 59 24 0 13 +ce941aa2bbfbc74bdf503844a962e226 0 12 6 6 2 9 12 0 0 4 1 0 15 0 10 0 0 7 14 19 0 2 0 0 0 40 7 0 19 21 0 21 0 15 0 19 0 8 0 0 4 11 0 5 3 0 5 0 0 5 41 19 0 23 0 10 36 0 0 0 29 0 1 +9999769d058494c3cd10e08b0052fe8b 0 11 8 1 30 5 16 0 0 3 1 10 35 36 0 0 0 7 0 4 1 39 0 28 6 15 2 0 9 40 0 7 7 7 6 4 0 1 0 39 0 16 0 2 58 0 81 0 0 8 26 7 2 15 0 12 13 0 1 18 9 0 2 +dc3d8d5600a0ee09c4dbce4143aea825 0 10 8 4 18 0 125 10 0 13 13 15 9 0 12 27 0 17 0 20 15 0 1 97 25 16 0 0 0 11 0 0 10 0 8 25 0 0 5 0 68 0 0 28 30 0 0 50 0 23 15 8 0 20 0 11 8 0 7 24 0 0 16 +fad027f8b97abb294b54d16e1f907f3b 0 10 1 10 39 17 126 3 1 17 14 13 26 11 18 1 0 31 15 49 0 2 2 11 1 39 18 0 4 10 0 2 25 17 2 40 3 9 2 32 5 10 1 20 19 6 12 0 7 12 33 32 5 29 0 36 27 0 13 7 7 0 7 +1cad34190fe6ec07b8fa96acf0fb331e 0 10 2 10 2 5 8 1 2 3 2 0 12 6 20 4 0 6 7 13 3 6 0 16 0 5 13 0 10 12 2 0 3 4 2 13 2 3 0 22 0 2 2 4 3 0 20 0 4 5 7 3 0 6 0 11 0 3 3 0 4 0 13 +bd39efc23197df932b7f9fab486d2ec0 0 10 0 4 0 1 13 9 0 4 7 1 0 4 0 0 0 9 2 11 8 0 0 2 4 1 11 0 4 6 0 1 0 8 0 4 4 9 0 0 3 10 0 4 3 3 0 0 0 4 2 6 2 7 0 10 0 0 1 8 7 0 2 +367755794e9c1b9b25336016b538e5f5 0 9 3 4 27 7 13 13 0 7 8 0 25 21 0 2 0 7 0 8 11 0 0 37 5 7 0 0 0 78 3 22 1 0 2 10 0 2 0 8 10 81 0 0 3 1 0 0 0 3 0 12 2 8 0 15 0 0 0 5 39 0 9 +ae1f2d99c9a8e0f36323cbcc0fc33082 0 8 4 4 11 0 14 2 0 4 11 9 8 20 0 0 0 8 0 0 2 18 0 10 3 6 0 0 0 14 8 4 0 6 0 4 0 0 0 3 8 20 0 3 30 7 14 2 0 12 1 9 0 5 7 4 0 0 5 2 8 0 2 +7a57586575c4a161c5ac49b7fcc5f97d 0 8 4 9 3 0 4 3 0 8 6 0 4 11 0 0 0 2 0 4 6 0 0 8 0 3 0 0 0 5 2 5 2 2 0 7 3 0 0 2 0 6 0 0 0 2 0 4 0 2 0 7 0 11 2 3 0 5 4 3 2 0 4 +8462a60c8847d4e2121c4829236d5a7c 0 8 2 6 10 5 45 2 0 2 11 0 12 31 6 0 0 12 0 6 5 37 0 21 17 2 0 0 2 15 0 5 2 0 3 11 0 8 0 6 5 14 0 1 44 0 8 0 0 3 14 3 2 3 0 10 7 2 0 19 3 0 0 +7dc8471d5b1e3f647073d4b765450304 0 7 6 13 67 0 151 10 0 63 79 0 15 116 6 0 0 25 0 1 1 47 0 70 25 11 0 0 7 46 3 40 6 0 3 40 15 19 0 49 89 53 0 0 104 6 14 0 0 22 83 25 7 11 0 0 26 0 35 32 7 0 14 +f94eeb7f22941b137797ba0dea4748bc 0 7 0 0 2 6 6 0 0 2 10 2 5 19 13 27 0 24 2 0 2 9 2 25 2 28 2 1 1 6 0 1 13 33 0 0 1 10 0 35 3 19 0 0 16 0 33 0 0 3 31 31 4 21 0 29 39 0 0 6 32 0 0 +5b7c190444d26061b7ebcb67ae7a29e4 0 7 5 8 13 0 0 7 2 0 5 0 2 5 8 3 0 5 0 7 2 21 0 9 3 4 2 0 2 22 0 26 0 13 4 6 2 5 2 5 5 19 2 0 11 3 43 0 0 11 13 3 3 4 0 6 14 0 2 10 11 0 4 +1be097520e171d2bf336ccefc59bf229 0 7 16 7 15 3 9 1 3 7 10 4 3 3 20 10 0 8 8 6 9 1 2 8 1 7 15 0 13 5 2 1 4 11 4 9 6 2 0 2 6 0 3 0 21 8 5 0 3 15 7 8 3 11 11 9 0 0 4 14 0 0 11 +fd1f7407a5a1affa19317020d32d0dce 0 7 17 2 19 5 117 4 5 6 17 0 31 43 0 0 3 37 9 23 10 10 2 59 13 49 16 2 17 10 11 0 4 26 9 23 0 5 9 27 26 30 0 6 12 96 13 0 0 1 27 77 4 49 24 57 14 0 4 12 14 10 6 +e65226ba560a270ce0f225e9d14065a0 0 6 0 0 42 20 0 2 0 1 0 0 18 110 1 0 0 3 0 0 17 7 0 32 1 37 8 0 18 26 0 4 7 19 1 14 0 2 2 64 9 24 1 5 25 1 12 0 0 17 3 0 0 0 0 0 3 0 8 21 7 0 10 +076e8a841c0692491049553b0714e5b5 0 6 0 5 9 2 17 2 0 5 0 0 14 29 6 0 2 29 0 0 2 32 0 32 6 4 5 0 7 21 0 8 4 2 1 12 0 3 0 49 9 15 0 9 23 7 17 0 0 13 8 7 3 6 0 18 15 0 4 8 3 0 0 +28a6a13790ee7556ef40b18e8273b93c 0 6 10 9 0 6 2 7 8 8 8 23 0 2 9 2 0 0 15 11 10 0 10 3 6 4 24 6 23 0 6 0 15 0 5 4 30 0 4 0 0 0 13 0 0 10 0 23 6 5 2 0 5 0 25 0 0 7 10 0 0 5 2 +5375e237c44f8c6165365111da958e4b 0 6 3 7 0 2 9 3 0 10 2 8 0 3 5 0 0 11 0 6 4 0 0 12 7 4 7 1 10 8 0 0 3 2 2 12 5 6 3 0 7 0 0 0 0 0 0 0 0 2 0 8 0 13 0 26 5 7 0 0 0 0 5 +19aab588259169b21e49e6db812e7436 0 6 5 3 0 17 0 10 1 0 2 0 0 2 4 0 0 2 7 8 13 0 4 0 0 0 7 7 10 0 3 5 3 8 1 3 10 3 0 0 0 0 0 15 0 1 0 12 0 4 0 0 28 4 0 1 10 0 13 0 0 5 0 +a9ad1aa66c173394bf876c66ef231557 0 6 24 26 16 9 39 6 23 35 25 2 30 28 18 7 0 17 11 21 3 39 3 35 9 15 6 0 0 29 3 14 9 13 21 12 0 8 2 0 12 43 17 12 13 13 69 12 4 12 24 28 2 27 5 11 5 0 21 29 37 2 10 +a5c5d6c831cc2296254e15e17bf0c023 0 5 7 0 1 0 26 0 0 1 4 1 10 4 0 0 0 7 0 1 0 0 0 7 5 6 0 0 0 3 2 5 1 7 4 3 0 3 0 0 5 18 0 0 1 2 3 0 0 9 0 15 2 22 9 16 0 0 0 7 13 0 0 +5d658473b7e96a5eea46689634ef3aef 0 5 0 0 32 18 3 11 0 0 3 0 6 4 0 0 6 0 22 20 4 0 6 12 6 6 25 7 21 7 6 8 9 13 0 22 0 2 7 0 14 24 6 0 11 17 9 40 13 0 0 0 9 0 0 1 5 9 24 12 13 3 8 +408308e5409ef51de3fe5960a96b754b 0 5 3 0 2 3 2 3 0 1 0 0 14 7 0 0 0 0 0 8 9 5 2 2 0 4 9 0 10 6 3 0 0 2 3 0 4 0 4 0 2 14 0 0 16 5 7 1 3 0 0 21 2 13 0 10 0 0 3 24 2 0 2 +2c914ff5d8bfa163ae4799a614d9e27f 0 5 0 5 9 7 8 4 0 4 0 0 4 18 0 0 0 3 0 3 7 5 0 23 4 10 10 0 3 2 0 4 0 3 0 7 0 2 0 35 6 13 2 0 2 3 11 0 0 0 7 0 5 3 0 2 5 0 0 1 0 0 3 +9f913fb81864f3e6754cf0cf4bcbf49e 0 5 13 10 2 0 26 2 0 4 3 2 8 91 0 0 0 8 0 7 6 6 0 9 10 6 4 4 4 8 4 0 8 2 12 4 4 5 0 0 15 20 0 0 0 2 4 0 0 0 0 13 0 10 0 18 0 0 0 0 1 0 5 +5bb4ef55966d113dc58766fcf822445b 0 5 0 5 8 8 4 1 18 5 11 2 2 2 39 0 0 3 3 11 3 0 0 5 2 16 62 0 41 0 0 0 7 9 2 4 12 8 4 4 4 4 43 18 0 0 3 10 2 55 0 14 3 9 0 8 0 0 6 4 11 0 7 +3bd57bd75b38f7b63f81a73c9685aee2 0 5 6 6 4 5 9 9 3 15 2 0 23 0 6 0 0 0 0 20 7 48 0 0 6 8 14 2 15 4 0 0 0 0 0 14 6 0 0 3 6 0 2 6 0 0 2 0 0 0 11 2 0 5 0 4 9 3 0 0 0 2 2 +3e50650739901b35905861f5ab70ce84 0 4 1 0 1 0 0 3 2 0 14 1 2 3 1 0 0 3 1 4 2 0 0 10 0 3 2 0 6 4 1 6 0 2 3 4 0 2 8 0 0 8 0 7 5 0 0 6 0 2 9 0 2 0 0 3 1 0 10 2 15 0 1 +06856aab9ac33e1475f18caae4f24549 0 4 3 5 10 2 6 0 0 0 7 0 4 5 0 0 0 8 0 2 0 6 0 3 3 0 2 0 3 9 0 2 0 2 0 7 0 2 0 3 9 5 0 0 3 0 9 0 0 0 3 3 2 4 0 10 3 0 2 3 2 0 5 +bc26203aa8b099e8f54cdffbc651bc5d 0 4 3 6 6 16 9 7 0 0 18 0 4 11 2 0 0 41 0 8 6 2 0 4 0 6 0 0 5 6 0 14 0 5 3 3 4 7 0 26 0 7 1 9 5 0 3 0 0 5 43 26 23 3 0 2 79 0 0 3 4 0 9 +bf639d942a1d673ddf10c1777f775773 0 4 3 5 2 0 8 2 0 5 4 5 0 5 2 0 0 3 0 2 0 4 6 0 0 0 5 1 5 0 2 3 3 2 0 0 2 0 3 1 2 0 0 0 0 2 2 0 4 0 0 0 3 2 8 1 0 3 2 0 0 2 0 +c804cd322927c634048b21efe2d02ba1 0 4 11 10 2 3 0 5 9 7 3 2 0 0 0 0 11 4 15 0 2 0 7 2 7 0 10 3 3 0 2 0 5 0 3 0 10 2 6 0 4 0 12 4 0 0 0 3 11 0 0 5 4 0 18 0 0 10 8 6 0 9 7 +a80ea07ede5c0a24e0c1e60eef9d3625 0 4 6 18 6 15 43 0 0 15 5 0 12 8 3 2 0 9 0 12 0 6 3 10 2 6 10 3 19 8 0 2 9 8 3 11 8 2 3 18 5 11 2 15 6 0 13 2 3 3 48 18 4 17 0 12 18 2 19 0 12 0 3 +32b088b61e65672a5ff60ceb880ab4ea 0 4 5 0 45 5 7 0 0 2 4 0 31 25 4 0 0 3 0 4 0 86 0 13 16 14 0 0 3 48 3 13 6 6 6 0 0 0 0 14 16 60 0 11 70 0 48 0 0 26 13 5 4 2 0 5 6 0 0 17 25 0 3 +7f37205f1e21e5e3f4f0b646499f763f 0 3 5 7 3 12 2 18 7 0 0 1 0 0 1 0 0 1 6 10 8 0 0 5 6 0 8 2 0 3 0 2 0 3 7 4 0 2 3 0 7 0 23 2 0 4 0 8 0 17 0 1 3 5 0 0 2 15 0 6 1 0 10 +c5ba47ca81139c2bca8ca5e90867b4bc 0 3 16 2 0 4 15 24 4 2 0 0 3 0 0 0 2 14 8 3 18 0 0 3 3 4 6 7 7 0 3 0 9 0 5 0 26 3 0 0 2 0 0 6 0 7 0 0 2 0 0 24 0 13 0 17 3 4 6 0 2 0 0 +39b7861cba6f35556506f7d1c157c872 0 3 5 18 7 9 3 0 4 11 8 0 0 0 3 0 0 22 6 16 3 0 2 2 6 2 5 0 4 0 3 2 3 8 2 7 13 0 6 0 0 0 0 2 3 0 0 5 0 5 4 18 11 5 11 15 4 13 2 4 4 0 0 +fd79824dfd6984907ddd6ce832ccf2ae 0 3 1 7 5 2 5 0 0 5 3 5 0 0 4 0 0 2 0 2 0 6 0 0 0 4 7 2 2 3 3 0 0 2 0 0 1 0 0 4 9 6 0 4 4 3 2 1 3 6 0 11 2 8 1 3 0 0 2 5 1 3 0 +a80b1d5ee5a4062349a18fdf6f452353 0 3 1 6 4 0 3 1 2 4 4 0 0 0 0 4 0 4 6 6 0 0 0 4 0 0 0 0 0 6 2 1 2 2 3 0 3 4 0 0 8 0 3 2 2 4 0 5 2 0 0 6 0 3 12 3 3 3 4 0 4 0 2 +cc0aeca1213d7989b842184f5929c45d 0 3 3 2 18 4 7 0 0 6 0 0 12 2 3 5 0 3 3 22 0 0 2 12 0 16 5 0 2 3 0 0 0 18 2 2 3 0 0 0 2 4 0 9 3 2 4 5 2 5 2 16 2 4 0 7 3 0 2 8 19 0 3 +9afc1be6534770c321c83868c64a46a1 0 2 11 15 0 17 0 14 37 16 6 38 0 0 12 0 3 3 19 15 13 0 0 2 1 4 2 7 0 0 2 4 17 4 0 4 16 2 8 0 4 0 36 0 0 6 0 74 1 3 5 0 10 0 27 0 13 12 0 0 0 0 0 +6dfe4bf5cfdc4644898662c4ea5ed758 0 2 30 8 0 4 2 107 29 25 6 2 0 2 0 0 7 3 0 11 53 0 15 2 9 0 10 17 1 0 12 0 4 0 6 0 49 0 0 2 0 0 15 5 0 12 0 0 16 0 0 14 0 12 54 4 7 6 1 0 1 5 0 +beda0b2755b7386b5bf0f52e41936701 0 2 2 3 0 4 1 8 2 0 0 2 0 0 0 0 0 4 0 8 8 0 2 2 6 2 3 0 0 2 3 2 3 5 2 4 3 3 0 0 10 0 0 0 0 0 2 5 0 2 2 5 2 1 0 6 6 0 0 5 1 0 0 +6bc1332183f3aa4a88cb9fcb6922b64d 0 2 43 10 1 35 6 8 22 14 9 0 3 7 13 2 1 13 0 11 5 0 0 13 24 0 2 0 18 0 0 8 32 0 20 10 29 0 0 0 4 2 24 0 0 10 0 2 0 0 0 6 20 9 10 13 4 34 0 0 11 0 0 +d9d1009a6b696a52bdd936675d62cf80 0 2 4 3 0 5 12 0 0 3 4 0 2 0 0 2 9 2 10 7 0 0 12 10 0 4 13 12 2 4 3 4 2 3 2 0 13 4 5 15 5 0 1 8 5 5 3 16 12 0 3 1 0 2 0 0 3 6 11 2 0 3 0 +c8d101459f157e89089c51379deda1ee 0 2 2 0 12 1 5 0 2 2 0 2 5 1 3 3 0 2 3 0 3 5 0 4 2 8 5 0 7 11 0 7 0 2 0 3 0 0 0 4 5 5 0 0 3 0 6 3 0 4 7 2 0 5 0 7 0 2 0 5 8 0 2 +93d6a1f565f0b2e9675cd9f4b41155d1 0 1 0 12 27 0 60 6 0 20 9 7 11 29 0 15 3 26 0 0 0 0 0 26 11 13 0 4 0 33 16 14 4 0 2 1 0 0 2 5 46 4 0 0 12 1 11 0 0 0 13 40 0 17 23 27 0 2 5 0 5 7 3 +7db1921eea4442963b6d099f4a29e375 0 0 15 0 214 13 0 9 29 0 0 0 106 2 125 7 0 0 13 6 20 20 0 72 73 280 124 0 172 302 0 121 0 490 35 31 0 0 26 5 100 105 27 9 285 0 317 0 0 288 0 0 4 0 0 0 0 0 8 596 50 0 293 +9b6cbdf89aadbfe760d3949b3d84ad8a 0 0 10 2 0 5 2 7 4 12 6 8 0 0 0 4 2 0 13 11 0 0 0 2 3 5 7 7 6 4 5 0 19 0 3 0 3 0 2 0 5 0 2 10 0 0 0 12 3 0 0 4 12 7 6 5 2 19 3 0 0 0 0 +5d2fdd0b11a598a45292a9e0e674de64 0 0 3 6 19 7 0 2 3 15 9 0 19 0 4 16 2 3 7 9 0 3 0 14 2 22 13 0 12 9 0 2 3 9 0 0 3 0 0 24 4 15 0 9 24 0 16 5 0 4 10 0 0 2 0 7 7 4 18 22 15 0 11 +02ef33b2fed8e8e15c08ec8dd57122ea 0 0 3 13 12 1 79 0 4 13 3 8 0 7 9 0 0 43 3 0 6 94 0 13 8 0 0 0 1 0 9 5 7 0 0 1 0 0 0 0 37 0 0 0 14 11 0 3 1 0 25 85 1 52 8 62 0 0 1 3 1 0 1 +aad5f79bf713118efb7ced50cd35c032 0 0 3 3 3 0 2 9 9 2 7 0 0 1 0 0 0 2 2 0 7 0 0 4 0 0 1 2 5 4 3 2 8 0 4 0 5 0 15 0 1 0 0 4 0 2 0 0 4 0 0 0 2 0 5 2 0 3 7 8 0 9 2 +3fd13a611554caeea7f50924723c27d6 0 0 2 0 6 0 0 0 0 4 2 0 7 2 7 13 0 0 0 3 0 2 0 9 0 5 7 0 8 4 0 0 5 16 0 1 2 1 0 14 0 11 0 5 7 0 7 2 0 0 2 3 0 2 0 2 2 0 10 8 18 0 1 +6867492366a2333f2e3e40306ffc6a27 0 0 0 12 7 6 5 3 0 1 1 1 6 31 7 2 0 24 0 12 0 8 0 9 0 19 0 0 0 20 0 15 0 9 0 7 2 0 0 67 0 19 0 4 4 1 11 0 0 3 78 15 0 3 0 6 48 0 3 0 6 0 0 +37250fe76d2e964801629842d2f21323 0 0 0 8 2 5 22 0 2 10 0 0 0 8 6 3 2 10 4 4 2 0 2 8 8 4 0 0 3 8 0 11 6 0 0 9 8 0 4 0 14 1 0 0 2 2 0 0 2 0 21 14 0 3 0 12 22 3 0 2 1 2 3 +f4a88211d25216dae035ea5ed3d6aece 0 0 0 7 17 33 0 2 5 0 0 0 0 90 0 8 3 1 1 2 3 7 2 41 0 0 10 0 21 26 4 4 0 0 0 0 1 1 6 58 0 0 0 0 21 0 9 2 6 3 0 0 7 0 0 0 3 0 5 16 1 0 13 +85eadab0e26f5408baf3a29ea371ed28 0 0 0 5 21 1 4 0 0 5 2 0 3 0 3 0 0 1 0 0 0 0 9 7 0 6 7 0 16 13 0 2 1 6 3 2 0 5 2 0 11 0 3 6 0 8 0 0 2 2 0 3 2 0 0 2 0 0 14 2 2 2 5 +1035e9930722a407e9dceacd6971c7ca 0 0 0 4 0 5 15 6 0 4 2 0 5 0 8 0 4 0 0 5 6 0 2 47 0 4 0 8 6 5 1 0 3 7 0 3 5 12 0 0 7 4 3 0 0 5 1 0 2 5 0 4 2 0 3 6 2 12 0 0 0 5 0 diff --git a/test/oracle/fixtures/soil_counts.tsv.license b/test/oracle/fixtures/soil_counts.tsv.license new file mode 100644 index 0000000..f09c155 --- /dev/null +++ b/test/oracle/fixtures/soil_counts.tsv.license @@ -0,0 +1,4 @@ +SPDX-License-Identifier: CC-BY-4.0 +SPDX-FileCopyrightText: 2021 Jacob T. Nearing et al. (figshare doi:10.6084/m9.figshare.14531724.v1) +Modified 2026 by Jonathan D.A. Jewell: one study extracted, samples intersected with metadata, +features filtered by prevalence (see test/oracle/make_fixtures.jl). See docs/DATASETS.md. diff --git a/test/oracle/fixtures/soil_groups.tsv b/test/oracle/fixtures/soil_groups.tsv new file mode 100644 index 0000000..266a5bf --- /dev/null +++ b/test/oracle/fixtures/soil_groups.tsv @@ -0,0 +1,64 @@ +sample group +Bact89 Soil +Bact1z3z2R Rhizosphere +Bact5z5z2 Soil +Bact3z5z2 Soil +Bact183 Rhizosphere +Bact3z1z2R Rhizosphere +Bact1z2z2R Rhizosphere +Bact3z4z2 Soil +Bact128 Soil +Bact3z5z2R Rhizosphere +Bact3z3z2 Soil +Bact90 Soil +Bact197 Rhizosphere +Bact5z5z2R Rhizosphere +Bact127 Soil +Bact175zFB Soil +Bact5z1z2 Soil +Bact1z5z2 Soil +Bact101 Soil +Bact5z3z2 Soil +Bact3z4z2R Rhizosphere +Bact198 Rhizosphere +Bact1z1z2 Soil +Bact180 Rhizosphere +Bact177 Soil +Bact192 Soil +Bact5z2z2R Rhizosphere +Bact5z1z2R Rhizosphere +Bact5z2z2 Soil +Bact181 Rhizosphere +Bact3z3z2R Rhizosphere +Bact176 Soil +Bact86 Soil +Bact194 Soil +Bact3z2z2R Rhizosphere +Bact5z3z2R Rhizosphere +Bact5z4z2 Soil +Bact1z3z2 Soil +Bact105 Soil +Bact5z4z2R Rhizosphere +Bact182 Rhizosphere +Bact196 Rhizosphere +Bact130 Soil +Bact87 Soil +Bact184 Rhizosphere +Bact102 Soil +Bact193 Soil +Bact103 Soil +Bact1z1z2R Rhizosphere +Bact126 Soil +Bact195 Rhizosphere +Bact1z4z2 Soil +Bact3z1z2 Soil +Bact1z5z2R Rhizosphere +Bact3z2z2 Soil +Bact1z4z2R Rhizosphere +Bact190 Soil +Bact104 Soil +Bact88 Soil +Bact179 Soil +Bact191 Soil +Bact1z2z2 Soil +Bact178 Soil diff --git a/test/oracle/fixtures/soil_groups.tsv.license b/test/oracle/fixtures/soil_groups.tsv.license new file mode 100644 index 0000000..f09c155 --- /dev/null +++ b/test/oracle/fixtures/soil_groups.tsv.license @@ -0,0 +1,4 @@ +SPDX-License-Identifier: CC-BY-4.0 +SPDX-FileCopyrightText: 2021 Jacob T. Nearing et al. (figshare doi:10.6084/m9.figshare.14531724.v1) +Modified 2026 by Jonathan D.A. Jewell: one study extracted, samples intersected with metadata, +features filtered by prevalence (see test/oracle/make_fixtures.jl). See docs/DATASETS.md. diff --git a/test/oracle/make_fixtures.jl b/test/oracle/make_fixtures.jl new file mode 100644 index 0000000..9d6a248 --- /dev/null +++ b/test/oracle/make_fixtures.jl @@ -0,0 +1,105 @@ +# SPDX-License-Identifier: MPL-2.0 +# SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# Rebuilds test/oracle/fixtures/{gut,soil}_*.tsv from the Nearing et al. (2022) +# figshare deposit (CC BY 4.0). The fixtures are committed; this script exists so +# anyone can check that they are what the deposit and the filter below produce. +# +# Run: julia --project=test/oracle test/oracle/make_fixtures.jl [path/to/tarball] +# With no argument the 253 MB tarball is downloaded to a temporary directory. + +using DelimitedFiles, Downloads, SHA + +const URL = "https://ndownloader.figshare.com/files/27857901" +const SHA256 = "53337642e26735fc138ed17089f6a467135719413bafbd1f9e5bff048c164b84" +const STUDIES = (gut = ("par_scheperjans", "par_scheperjans_metadata.tsv"), + soil = ("Blueberry", "Blueberry_metadata.tsv")) +const MIN_PREVALENCE = 0.25 +const MAX_FEATURES = 300 +const OUT = joinpath(@__DIR__, "fixtures") + +""" + fetch_tarball(arg) -> path + +Return the path to the deposit tarball, downloading it when `arg` is `nothing`, +and refuse it unless its SHA-256 matches the recorded digest. +""" +function fetch_tarball(arg) + path = arg === nothing ? Downloads.download(URL, joinpath(mktempdir(), "da.tar.gz")) : arg + got = bytes2hex(open(sha256, path)) + got == SHA256 || error("checksum mismatch for $path: $got") + return path +end + +""" + read_study(dir, study, metafile) -> (counts, features, samples, groups) + +Read one study's raw ASV table (features × samples) and its two-column +metadata, keeping only samples present in both, in table order. +""" +function read_study(dir, study, metafile) + t = readdlm(joinpath(dir, study, "$(study)_ASVs_table.tsv"), '\t', String; comments = false) + m = readdlm(joinpath(dir, study, metafile), '\t', String; comments = false) + group = Dict(m[i, 1] => m[i, 2] for i in 2:size(m, 1)) + keep = [j for j in 2:size(t, 2) if haskey(group, t[1, j])] + samples = t[1, keep] + features = t[2:end, 1] + raw = parse.(Float64, t[2:end, keep]) # Blueberry writes counts as "474.0" + all(isinteger, raw) || error("$study: non-integer counts; not a raw count table") + counts = Int.(raw) + return counts, features, samples, [group[s] for s in samples] +end + +""" + filter_features(counts, features) -> (counts, features) + +Keep features present in at least `MIN_PREVALENCE` of samples, then at most the +`MAX_FEATURES` most prevalent (ties by total count, then source order). Source +row order is preserved in the output. +""" +function filter_features(counts, features) + prev = vec(sum(counts .> 0; dims = 2)) ./ size(counts, 2) + tot = vec(sum(counts; dims = 2)) + cand = findall(>=(MIN_PREVALENCE), prev) + ranked = sort(cand; by = i -> (-prev[i], -tot[i], i)) + rows = sort(ranked[1:min(MAX_FEATURES, length(ranked))]) + return counts[rows, :], features[rows] +end + +""" + write_fixture(name, counts, features, samples, groups) + +Write `_counts.tsv` (features × samples, header row of sample ids) and +`_groups.tsv` (sample id, group) under `OUT`. +""" +function write_fixture(name, counts, features, samples, groups) + all(>(0), sum(counts; dims = 1)) || error("$name: a sample has no reads after filtering") + mkpath(OUT) + open(joinpath(OUT, "$(name)_counts.tsv"), "w") do io + println(io, join(vcat("feature", samples), '\t')) + for i in eachindex(features) + println(io, join(vcat(features[i], string.(counts[i, :])), '\t')) + end + end + open(joinpath(OUT, "$(name)_groups.tsv"), "w") do io + println(io, "sample\tgroup") + foreach(k -> println(io, samples[k], '\t', groups[k]), eachindex(samples)) + end + println(name, ": ", length(features), " features × ", length(samples), " samples; groups ", + Dict(g => count(==(g), groups) for g in unique(groups))) +end + +"""Extract the needed studies from the tarball and write both fixtures.""" +function main(args) + tarball = fetch_tarball(isempty(args) ? nothing : args[1]) + dir = mktempdir() + members = ["Hackathon/Studies/$(s[1])" for s in values(STUDIES)] + run(`tar -xzf $tarball -C $dir $members`) + for (name, (study, metafile)) in pairs(STUDIES) + c, f, s, g = read_study(joinpath(dir, "Hackathon", "Studies"), study, metafile) + c, f = filter_features(c, f) + write_fixture(String(name), c, f, s, g) + end +end + +main(ARGS) diff --git a/test/oracle/runoracle.jl b/test/oracle/runoracle.jl index a940556..6039fa3 100644 --- a/test/oracle/runoracle.jl +++ b/test/oracle/runoracle.jl @@ -35,7 +35,7 @@ function agree(native, r1, r2) end @testset "ALDEx2 oracle" begin - datasets = Any[("mock", mock_dataset())] + datasets = Any[("mock", mock_dataset()), ("gut", fixture_dataset("gut")), ("soil", fixture_dataset("soil"))] for (name, (x, f, g, truth)) in datasets nat = aldex2(x, f, g; mc_samples = MC, seed = 1) r1 = aldex2_reference(x, f, g; mc_samples = MC, seed = 1) From 9a1cf8ee35163c0abcb7e6fd09e5a807ba6ef34b Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Fri, 2 Oct 2026 15:11:50 +0100 Subject: [PATCH 3/7] ALDEx2 docs: P3 is centring (tested), not depth invariance Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_019Y6e175rh1LbrsEhQvCrJ1 --- src/Methods/ALDEx2.jl | 6 ++++-- test/properties.jl | 5 ++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Methods/ALDEx2.jl b/src/Methods/ALDEx2.jl index 12d69a4..a77644d 100644 --- a/src/Methods/ALDEx2.jl +++ b/src/Methods/ALDEx2.jl @@ -12,8 +12,10 @@ proportions from Dirichlet(counts[i, :] .+ prior) by normalising Gamma(α, 1) draws, then take the CLR of the draw. The result is indexed `[sample, feature, instance]`. -Each draw is closed before the log, so the CLR of every instance is invariant to -the sample's sequencing depth up to the prior (P3, proofs/PROOF-STATUS.md). +Every instance is centred: each sample's row sums to zero (tested as P3 in +`test/property_aldex2.jl`, not proved). The instances are deliberately not +depth-invariant: a deeper sample has a tighter Dirichlet posterior, which is how +ALDEx2 carries sampling uncertainty into the tests. """ function dirichlet_clr_instances(rng::AbstractRNG, counts::AbstractMatrix{<:Integer}; mc_samples::Integer = 128, prior::Real = 0.5) diff --git a/test/properties.jl b/test/properties.jl index c856f0d..c5da5b5 100644 --- a/test/properties.jl +++ b/test/properties.jl @@ -59,9 +59,8 @@ function count_tables(seed; n = 8) end end -"""P3: every Monte-Carlo instance from generator `f(rng, counts)` is a CLR: -each instance row sums to zero, and is unchanged when a sample's counts are -replicated across a constant column offset in log space (closure cancels).""" +"""P3: every Monte-Carlo instance from generator `f(rng, counts)` is centred +like a CLR: each sample's row of each instance sums to zero.""" prop_instances_are_clr(f; seed = 7) = all(count_tables(seed)) do (x, _) inst = f(StableRNG(seed), x) all(abs.(sum(inst; dims = 2)) .< 1e-9) From 23418e434553444d17f033ec73639eac4fc4441d Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Fri, 2 Oct 2026 16:04:56 +0100 Subject: [PATCH 4/7] Oracle: pass conds as character, read rcopy's underscored columns, gate Wilcoxon p too ALDEx2 1.42 calls round() on conds, which errors for a factor; it builds its own sorted factor, so a character vector gives the same level order. RCall's rcopy renames R's dotted columns (we.ep -> we_ep). Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_019Y6e175rh1LbrsEhQvCrJ1 --- ext/CompositionalDARCallExt.jl | 13 +++++++++---- test/oracle/runoracle.jl | 8 +++++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/ext/CompositionalDARCallExt.jl b/ext/CompositionalDARCallExt.jl index 92852a1..eb8b597 100644 --- a/ext/CompositionalDARCallExt.jl +++ b/ext/CompositionalDARCallExt.jl @@ -38,7 +38,11 @@ function CompositionalDA.aldex2_reference(counts::AbstractMatrix{<:Integer}, fea set.seed($seed) reads <- as.data.frame(reads); rownames(reads) <- fnames colnames(reads) <- paste0("s", seq_len(ncol(reads))) - res <- ALDEx2::aldex(reads, factor(conds, levels = lv), mc.samples = $mc_samples, + # A character vector, not a factor: ALDEx2 1.42 calls round() on conds, + # which errors for a factor. It builds its own factor, so the level + # order is the same sorted order as `lv`. + stopifnot(identical(sort(unique(conds)), lv)) + res <- ALDEx2::aldex(reads, conds, mc.samples = $mc_samples, test = "t", effect = TRUE, denom = "all", verbose = FALSE) res <- res[fnames, ] res$feature <- rownames(res) @@ -47,9 +51,10 @@ function CompositionalDA.aldex2_reference(counts::AbstractMatrix{<:Integer}, fea rcopy(DataFrame, R"res"), rcopy(String, R"aldex_version") end res, ver = df - table = DataFrame(feature = res[!, "feature"], effect = res[!, "effect"], pvalue = res[!, "we.ep"], - qvalue = res[!, "we.eBH"], wi_pvalue = res[!, "wi.ep"], wi_qvalue = res[!, "wi.eBH"], - diff_btw = res[!, "diff.btw"], diff_win = res[!, "diff.win"], rab_all = res[!, "rab.all"]) + # rcopy turns R's dotted column names (we.ep, diff.btw, ...) into underscores. + table = DataFrame(feature = res[!, "feature"], effect = res[!, "effect"], pvalue = res[!, "we_ep"], + qvalue = res[!, "we_eBH"], wi_pvalue = res[!, "wi_ep"], wi_qvalue = res[!, "wi_eBH"], + diff_btw = res[!, "diff_btw"], diff_win = res[!, "diff_win"], rab_all = res[!, "rab_all"]) prov = Provenance(:aldex2, :r_reference; seed, mc_samples, r_package = "ALDEx2 $ver", contrast = "$(levels[2]) vs $(levels[1])") return DAResult(table, prov) diff --git a/test/oracle/runoracle.jl b/test/oracle/runoracle.jl index 6039fa3..efb8198 100644 --- a/test/oracle/runoracle.jl +++ b/test/oracle/runoracle.jl @@ -15,7 +15,7 @@ include("datasets.jl") const MC = 512 const SLACK = 2.0 -const FLOOR = (effect = 0.05, pvalue = 0.01) +const FLOOR = (effect = 0.05, pvalue = 0.01, wi_pvalue = 0.01) """Largest absolute difference of column `c` between two result tables.""" maxdiff(a, b, c) = maximum(abs.(a.table[!, c] .- b.table[!, c])) @@ -23,11 +23,12 @@ maxdiff(a, b, c) = maximum(abs.(a.table[!, c] .- b.table[!, c])) """ agree(native, r1, r2) -> NamedTuple -Native-vs-R and R-vs-R(other seed) distances for effect and expected Welch p, +Native-vs-R and R-vs-R(other seed) distances for effect, expected Welch p and +expected Wilcoxon p, and whether native is within tolerance of R for each. """ function agree(native, r1, r2) - out = map((:effect, :pvalue)) do c + out = map((:effect, :pvalue, :wi_pvalue)) do c dn = maxdiff(native, r1, c); dr = maxdiff(r2, r1, c) c => (native = dn, r_vs_r = dr, ok = dn <= SLACK * dr + FLOOR[c]) end @@ -44,6 +45,7 @@ end println(name, ": ", a, " R=", r1.provenance.parameters) @test a.effect.ok @test a.pvalue.ok + @test a.wi_pvalue.ok @test cor(nat.table.effect, r1.table.effect) > 0.99 if !isempty(truth) hit(t) = Set(t.table.feature[t.table.qvalue .< 0.05]) From 87a6316cff6121310c804c148928a92740c922e3 Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Fri, 2 Oct 2026 16:07:56 +0100 Subject: [PATCH 5/7] ALDEx2 behavioural spec, written before the clean-room re-implementation The native and reference results disagreed beyond Monte-Carlo noise. This documents the two definitions behind that: the consistent-sign expected p and BH, and independent between/within pairing for the effect. It also records which reference source was read to diagnose it. Owner ruling: the code is re-derived from this document by an agent that has not read that source. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_019Y6e175rh1LbrsEhQvCrJ1 --- docs/ALDEx2-SPEC.md | 153 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 docs/ALDEx2-SPEC.md diff --git a/docs/ALDEx2-SPEC.md b/docs/ALDEx2-SPEC.md new file mode 100644 index 0000000..9e1863f --- /dev/null +++ b/docs/ALDEx2-SPEC.md @@ -0,0 +1,153 @@ + + + +# ALDEx2: behavioural specification + +This is the specification the native `aldex2` is written from. It describes +**what** the reported numbers are, as measurable behaviour, so that an +implementation can be written from it alone. + +## Provenance + +The method is from Fernandes et al. 2013 (PLoS ONE 8:e67019) and 2014 +(Microbiome 2:15). The papers do not pin down two details that decide the +reported numbers: + +- how the per-instance p-values are combined into an expected p-value; +- how the random pairs behind the effect size are drawn. + +Bioconductor ALDEx2's public documentation describes the first only loosely. +NEWS for 1.33 says "all p-values calculated are now posterior p-values with +consistent sign", and the vignette calls `we.ep` "a posterior predictive +p-value". + +On 2026-10-02 the native and Bioconductor 1.42.0 results disagreed beyond +Monte-Carlo noise. To find out why, the coding agent (Claude, session +https://claude.ai/code/session_019Y6e175rh1LbrsEhQvCrJ1) read the reference +package's R source (GPL ≥ 3): `aldex.ttest`, `t.fast`, `wilcox.fast` and +`aldex.effect`. No code was copied. The behaviour below was then confirmed +numerically on the reference package's own Monte-Carlo instances: on the mock, +gut and soil datasets, the p-value rules reproduce its `we.ep`, `we.eBH` and +`wi.ep` to within 1e-14. + +The owner ruled that the native code is written from this document by someone +who has **not** read the reference source. + +## Notation + +- Input: integer counts with `n` samples and `d` features, and a two-level + condition per sample. +- `L1 < L2` are the two condition levels in sorted order. +- `inst[i, j, k]` is the CLR value of sample `i`, feature `j`, in Monte-Carlo + instance `k = 1..mc`. These are produced by the existing + `dirichlet_clr_instances`, which is unchanged by this document. +- **Test group 1** is the condition of the *first sample in input order*. + **Test group 2** is the other condition. With `n1` and `n2` samples + respectively, `n1 + n2 = n`. + +**Calling convention.** The function is `aldex2_from_instances(inst, i1, i2; rng, first_is_i1 = true)`. + +- `i1` and `i2` are the sample rows of `L1` and `L2`. +- `first_is_i1` says whether the first input sample belongs to `L1`. If it does, + `i1` is test group 1; if not, `i2` is. +- `aldex2` computes `first_is_i1` from `groups[1]`. +- The property test P6 calls the function without this flag and gets the + default. + +Test group 1 only matters for the exact Wilcoxon p-value, because that +distribution is discrete. The rule is part of the reference behaviour: on the +soil dataset, whose first sample is in `L2`, using `L1` instead moves `wi_pvalue` +by up to 0.0097. + +## Per-instance one-sided p-values + +For each instance `k` and feature `j`, let `a` be the values of test group 1 and +`b` the values of test group 2. + +- **Welch.** `t = (mean(a) − mean(b)) / sqrt(s_a²/n1 + s_b²/n2)`, using sample + variances. The degrees of freedom are Welch–Satterthwaite. The upper-tail + p-value is `pW = P(T_df ≥ t)`. +- **Wilcoxon rank sum.** `U = #{(x, y) : x ∈ a, y ∈ b, x > y}`. + - If `n1 < 50` **and** `n2 < 50`: `pR = P(U' ≥ U)` under the exact null + distribution of the Mann–Whitney statistic for sizes `(n1, n2)`. + - Otherwise use the normal approximation **without continuity correction**: + `pR = 1 − Φ((U − n1·n2/2) / sqrt(n1·n2·(n1+n2+1)/12))`. + - CLR instances are continuous, so ties have probability zero. If any do + occur, count a tie as ½ in `U`; the result in that case is not + oracle-checked. + +## Consistent-sign expected p-values + +For a per-instance upper-tail p-value `p` (either `pW` or `pR`), define the two +doubled directional values: + +``` +g = min(1, 2p) # "group 1 higher" +l = min(1, 2(1 − p)) # "group 1 lower" (note: 1 − p, not the lower tail) +``` + +Then, per test: + +- **Expected p:** `min( mean_k g_k , mean_k l_k )`. This is reported as + `pvalue` for Welch and `wi_pvalue` for Wilcoxon. +- **Expected BH:** within each instance, BH-adjust the vector of `g` over + features, and separately the vector of `l` over features, using the existing + `bh_adjust`. Average each over instances, then take the elementwise minimum of + the two averages. This is reported as `qvalue` and `wi_qvalue`. + +This is not the mean of two-sided p-values: by Jensen, the mean of the minimum +is at most the minimum of the means. The two agree when a feature's direction is +the same in every instance. + +## Effect size + +The effect is computed on the **sorted** levels, so its sign is `L2 − L1`. The +test-group rule does not apply here. + +For each feature `j`: + +- `x1` pools all instance values of `L1` samples, `n_L1·mc` values in total. + `x2` pools those of `L2` samples. +- `m = min(length(x1), length(x2))`. +- **Within-group spread.** For each group `g`, take two independent uniformly + random permutations of `x_g` and keep the first `m` elements of each. `win_g` + is their elementwise absolute difference. +- **Between-group difference.** Take one further independent random + permutation of `x1` and one of `x2`, each truncated to `m`. Then + `btw = perm(x2) − perm(x1)`. + - These draws are **independent** of the within-group draws. Reusing the same + elements in `btw` and `win` biases the effect: on soil, the gap was 0.18 + against noise of 0.03. +- `winmax = max.(win_1, win_2)`. +- `ratio = btw ./ winmax`. Any `0/0` becomes `0`; a nonzero value divided by 0 + stays `±Inf`. +- The reported values are: + - `effect = median(ratio)` + - `diff_btw = median(btw)` + - `diff_win = median(winmax)` + - `rab_all = median` of every value of feature `j` over all samples and + instances. + +**Deliberate difference from the reference, required by P6.** The permutations +are drawn as **index** permutations once and shared by every feature. Relabelling +the features then permutes every output column exactly. The reference draws them +per feature. The marginal distribution of each feature's output is the same +under both; only the correlation across features differs. Sharing gives exact +permutation-equivariance. + +## Determinism + +All randomness comes from one `StableRNG(seed)`. The draws happen in this order: + +1. the Dirichlet instances; +2. the effect-size index permutations. + +## What is checked, and how + +- **Exact:** given the same instances, the p-value columns must match the + reference to floating-point precision. A diagnostic run on the reference's own + instances reproduced this. +- **Statistical:** with independent Monte-Carlo draws, the oracle requires + `|native − R| ≤ 2 × |R(seed 1) − R(seed 2)| + floor` per column + (`test/oracle/runoracle.jl`). +- **Not proved:** calibration; see `PROOF-STATUS.md` and the README. From c163e5f013862884653e3a5880bc8e87ace67611 Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Fri, 2 Oct 2026 16:16:58 +0100 Subject: [PATCH 6/7] ALDEx2: consistent-sign expected p/BH and independent effect pairing, from the spec Re-implemented from docs/ALDEx2-SPEC.md by a separate agent that never had access to the reference source. Oracle (MC 512) now passes on all three datasets: native-vs-R is within R's own seed-to-seed noise on effect, Welch p and Wilcoxon p. Bump to 0.2.0. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_019Y6e175rh1LbrsEhQvCrJ1 --- Project.toml | 2 +- README.md | 8 ++- docs/ALDEx2-SPEC.md | 5 +- docs/R-SUNSET.md | 5 +- src/CompositionalDA.jl | 4 +- src/Methods/ALDEx2.jl | 152 ++++++++++++++++++++++++++++------------- test/mutants.jl | 2 +- 7 files changed, 119 insertions(+), 59 deletions(-) diff --git a/Project.toml b/Project.toml index bfb260a..d7be6aa 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "CompositionalDA" uuid = "a77efed1-127c-5b9d-bf19-e0eccfa50304" -version = "0.1.0" +version = "0.2.0" authors = ["Jonathan D.A. Jewell "] [deps] diff --git a/README.md b/README.md index 6ef7e33..0f8f4a8 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,11 @@ live in a separate package, It needs no Python and no TensorFlow. R is needed only for the optional reference backend. -> **Status: v0.1.0, core layer only.** Closure, the centred log-ratio, zero -> policies, Benjamini–Hochberg and the result/provenance types are implemented. -> The methods land one per release: ALDEx2 (v0.2), then ANCOM-BC (v0.3). +> **Status: v0.2.0.** The core layer (closure, the centred log-ratio, zero +> policies, Benjamini–Hochberg, result/provenance types) and two-group ALDEx2 +> (`aldex2`) are implemented. ALDEx2 is defined by `docs/ALDEx2-SPEC.md` and +> agrees with Bioconductor ALDEx2 1.42.0 within Monte-Carlo noise on the mock, +> gut and soil datasets. ANCOM-BC lands in v0.3. > Nothing here claims a method that is not yet in `src/`. ## Input contract diff --git a/docs/ALDEx2-SPEC.md b/docs/ALDEx2-SPEC.md index 9e1863f..f8bbda6 100644 --- a/docs/ALDEx2-SPEC.md +++ b/docs/ALDEx2-SPEC.md @@ -31,7 +31,10 @@ gut and soil datasets, the p-value rules reproduce its `we.ep`, `we.eBH` and `wi.ep` to within 1e-14. The owner ruled that the native code is written from this document by someone -who has **not** read the reference source. +who has **not** read the reference source. That is what happened: a separate +agent that was barred from the reference source, R and web search wrote +`src/Methods/ALDEx2.jl` from this document (spec committed alone as `87a6316`, +before the code). ## Notation diff --git a/docs/R-SUNSET.md b/docs/R-SUNSET.md index d074c3f..99afa52 100644 --- a/docs/R-SUNSET.md +++ b/docs/R-SUNSET.md @@ -3,8 +3,9 @@ # Sunset criterion for the R reference backend -> **Status:** the extension described here is planned and not yet in the tree: -> there is no `ext/` directory and no `test/oracle_*.jl` yet. +> **Status (v0.2.0):** ALDEx2 is release 1 of 2 within tolerance (oracle run of +> 2026-10-02, all 13 checks passing). The frozen fixtures under `test/fixtures/` +> described below do not exist yet. The R backend (`ext/CompositionalDARCallExt.jl`, loaded only when RCall is present) is a bridge, not a product. It never owns R state. Every R call runs inside a diff --git a/src/CompositionalDA.jl b/src/CompositionalDA.jl index d22ac3f..3a6300c 100644 --- a/src/CompositionalDA.jl +++ b/src/CompositionalDA.jl @@ -16,8 +16,8 @@ proved in `proofs/agda` and mirrored by property tests in `test/`. See module CompositionalDA using DataFrames -using Distributions: Gamma -using HypothesisTests: UnequalVarianceTTest, ExactMannWhitneyUTest, ApproximateMannWhitneyUTest, pvalue +using Distributions: Gamma, Normal, ccdf +using HypothesisTests: UnequalVarianceTTest, pvalue using LinearAlgebra using Random using StableRNGs: StableRNG diff --git a/src/Methods/ALDEx2.jl b/src/Methods/ALDEx2.jl index a77644d..f63c177 100644 --- a/src/Methods/ALDEx2.jl +++ b/src/Methods/ALDEx2.jl @@ -1,8 +1,8 @@ # SPDX-License-Identifier: MPL-2.0 # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) # -# ALDEx2, written from Fernandes et al. 2013 (PLoS ONE 8:e67019) and 2014 -# (Microbiome 2:15). It is not a port of the Bioconductor source. +# ALDEx2, written from docs/ALDEx2-SPEC.md and Fernandes et al. 2013 (PLoS ONE +# 8:e67019) and 2014 (Microbiome 2:15). It is not a port of the Bioconductor source. """ dirichlet_clr_instances(rng, counts; mc_samples = 128, prior = 0.5) -> Array{Float64,3} @@ -38,82 +38,134 @@ function dirichlet_clr_instances(rng::AbstractRNG, counts::AbstractMatrix{<:Inte end """ - welch_p(a, b) -> Float64 + welch_upper_p(a, b) -> Float64 -Two-sided Welch two-sample t-test p-value. +One-sided Welch t-test p-value `P(T ≥ t)` for `mean(a) > mean(b)`, with +Welch–Satterthwaite degrees of freedom. """ -welch_p(a, b) = pvalue(UnequalVarianceTTest(a, b)) +welch_upper_p(a, b) = pvalue(UnequalVarianceTTest(a, b); tail = :right) """ - wilcoxon_p(a, b) -> Float64 + mann_whitney_u(a, b) -> Float64 -Two-sided Wilcoxon rank-sum (Mann–Whitney) p-value. It is exact when both groups -have fewer than 50 observations and there are no ties, and uses the normal -approximation otherwise. This is the same rule as R's `wilcox.test` default. +`#{(x, y) : x ∈ a, y ∈ b, x > y}`, with each tie counted as ½. """ -function wilcoxon_p(a, b) - exact = length(a) < 50 && length(b) < 50 && allunique(vcat(a, b)) - exact ? pvalue(ExactMannWhitneyUTest(a, b)) : pvalue(ApproximateMannWhitneyUTest(a, b)) +function mann_whitney_u(a, b) + u = 0.0 + for x in a, y in b + u += x > y ? 1.0 : x == y ? 0.5 : 0.0 + end + return u end """ - effect_pairs(rng, n1, n2, m) -> NamedTuple + mann_whitney_upper_tail(n1, n2) -> Vector{Float64} + +Exact null upper tail of the Mann–Whitney statistic for group sizes `(n1, n2)`: +element `u + 1` is `P(U' ≥ u)` for `u = 0..n1·n2`. +""" +function mann_whitney_upper_tail(n1::Integer, n2::Integer) + # prev[n+1] / cur[n+1] hold the point probabilities for sizes (m-1, n) / (m, n). + prev = [[1.0] for _ in 0:n2] + for m in 1:n1 + cur = Vector{Vector{Float64}}(undef, n2 + 1) + cur[1] = [1.0] + for n in 1:n2 + p = zeros(m * n + 1) + for (u, v) in enumerate(prev[n + 1]); p[u + n] += v * m / (m + n); end + for (u, v) in enumerate(cur[n]); p[u] += v * n / (m + n); end + cur[n + 1] = p + end + prev = cur + end + return clamp.(reverse(cumsum(reverse(prev[n2 + 1]))), 0.0, 1.0) # rounding can pass 1 +end -Random index vectors for the ALDEx2 effect size: `m` draws of a group-1 element, -a group-2 element, and a second element of each group for the within-group -spread. They are drawn once and shared by every feature, so relabelling the -features permutes the effect sizes exactly (P6). """ -effect_pairs(rng::AbstractRNG, n1::Integer, n2::Integer, m::Integer) = - (a = rand(rng, 1:n1, m), b = rand(rng, 1:n2, m), - a2 = rand(rng, 1:n1, m), b2 = rand(rng, 1:n2, m)) + wilcoxon_upper_p(a, b, tail) -> Float64 + +One-sided Wilcoxon rank-sum p-value for `a` above `b`. With `tail` from +[`mann_whitney_upper_tail`](@ref) it is exact, `P(U' ≥ U)`; with `tail === +nothing` it is the normal approximation without continuity correction. +""" +function wilcoxon_upper_p(a, b, tail) + u = mann_whitney_u(a, b) + tail === nothing || return tail[Int(ceil(u)) + 1] + n1 = length(a); n2 = length(b) + return ccdf(Normal(), (u - n1 * n2 / 2) / sqrt(n1 * n2 * (n1 + n2 + 1) / 12)) +end + +""" + effect_pairs(rng, n1, n2) -> NamedTuple + +Index permutations for the ALDEx2 effect size over pooled groups of `n1` and +`n2` values, each truncated to `m = min(n1, n2)`: two per group for the +within-group spread (`w1a`, `w1b`, `w2a`, `w2b`), then one per group for the +between-group difference (`b1`, `b2`). They are drawn once and shared by every +feature, so relabelling the features permutes the effect sizes exactly (P6). +""" +function effect_pairs(rng::AbstractRNG, n1::Integer, n2::Integer) + m = min(n1, n2) + w1a = randperm(rng, n1)[1:m]; w1b = randperm(rng, n1)[1:m] + w2a = randperm(rng, n2)[1:m]; w2b = randperm(rng, n2)[1:m] + b1 = randperm(rng, n1)[1:m]; b2 = randperm(rng, n2)[1:m] + return (; w1a, w1b, w2a, w2b, b1, b2) +end """ aldex2_effect(pairs, x1, x2) -> (effect, diff_btw, diff_win) ALDEx2 effect size for one feature. `x1` and `x2` are the instance-pooled CLR -values of the two groups and `pairs` comes from [`effect_pairs`](@ref). The -between-group difference is taken over random cross-group pairs. The -within-group dispersion is the larger of the two groups' absolute differences -over random within-group pairs. The effect is the median of their ratio; -`diff_btw` and `diff_win` are the medians of each part. +values of the lower and higher sorted level, and `pairs` comes from +[`effect_pairs`](@ref). `btw = x2 − x1` over one pairing, `winmax` is the larger +of the two groups' within-group absolute differences, and the results are the +medians of `btw ./ winmax` (with `0/0` as 0), of `btw` and of `winmax`. """ function aldex2_effect(pairs, x1::AbstractVector, x2::AbstractVector) - a = x1[pairs.a]; b = x2[pairs.b] - btw = b .- a - win = max.(abs.(a .- x1[pairs.a2]), abs.(b .- x2[pairs.b2])) - ratio = btw ./ max.(win, eps()) + win = max.(abs.(x1[pairs.w1a] .- x1[pairs.w1b]), abs.(x2[pairs.w2a] .- x2[pairs.w2b])) + btw = x2[pairs.b2] .- x1[pairs.b1] + ratio = btw ./ win + ratio[isnan.(ratio)] .= 0.0 return median(ratio), median(btw), median(win) end """ - aldex2_from_instances(inst, i1, i2; rng) -> DataFrame + aldex2_from_instances(inst, i1, i2; rng, first_is_i1 = true) -> DataFrame The deterministic part of ALDEx2, applied to Monte-Carlo CLR instances -`inst[sample, feature, instance]` with group-1 rows `i1` and group-2 rows `i2`. -For every instance it runs a Welch t-test and a Wilcoxon test per feature and -BH-adjusts across features. The reported values are the means over instances. -`rng` is used only for the effect-size pairing indices. The columns are not -named here; [`aldex2`](@ref) adds the feature names. +`inst[sample, feature, instance]`, with `i1`/`i2` the rows of the lower/higher +sorted level. Test group 1 is `i1` if `first_is_i1`, else `i2`. Each instance +gives one-sided Welch and Wilcoxon p-values for test group 1 above group 2; the +reported `pvalue`/`wi_pvalue` and `qvalue`/`wi_qvalue` are the consistent-sign +expected p and expected BH of `docs/ALDEx2-SPEC.md`. The effect columns are on +the sorted levels; `rng` is used only for their index permutations. The columns +are not named here; [`aldex2`](@ref) adds the feature names. """ function aldex2_from_instances(inst::AbstractArray{<:Real,3}, i1::AbstractVector{<:Integer}, - i2::AbstractVector{<:Integer}; rng::AbstractRNG) + i2::AbstractVector{<:Integer}; rng::AbstractRNG, + first_is_i1::Bool = true) _, d, mc = size(inst) - we_p = zeros(d); we_q = zeros(d); wi_p = zeros(d); wi_q = zeros(d) + t1, t2 = first_is_i1 ? (i1, i2) : (i2, i1) + tail = length(t1) < 50 && length(t2) < 50 ? mann_whitney_upper_tail(length(t1), length(t2)) : nothing + acc = Dict(k => zeros(d) for k in (:wg, :wl, :wgq, :wlq, :rg, :rl, :rgq, :rlq)) pw = Vector{Float64}(undef, d); pr = Vector{Float64}(undef, d) for k in 1:mc for j in 1:d - a = inst[i1, j, k]; b = inst[i2, j, k] - pw[j] = welch_p(a, b) - pr[j] = wilcoxon_p(a, b) + a = inst[t1, j, k]; b = inst[t2, j, k] + pw[j] = welch_upper_p(a, b) + pr[j] = wilcoxon_upper_p(a, b, tail) + end + for (p, g, l, gq, lq) in ((pw, :wg, :wl, :wgq, :wlq), (pr, :rg, :rl, :rgq, :rlq)) + up = min.(1.0, 2 .* p); dn = min.(1.0, 2 .* (1 .- p)) + acc[g] .+= up; acc[l] .+= dn + acc[gq] .+= bh_adjust(up); acc[lq] .+= bh_adjust(dn) end - we_p .+= pw; we_q .+= bh_adjust(pw) - wi_p .+= pr; wi_q .+= bh_adjust(pr) end - we_p ./= mc; we_q ./= mc; wi_p ./= mc; wi_q ./= mc + expected(g, l) = min.(acc[g], acc[l]) ./ mc + we_p = expected(:wg, :wl); we_q = expected(:wgq, :wlq) + wi_p = expected(:rg, :rl); wi_q = expected(:rgq, :rlq) - n1 = length(i1) * mc; n2 = length(i2) * mc - pairs = effect_pairs(rng, n1, n2, max(n1, n2)) + pairs = effect_pairs(rng, length(i1) * mc, length(i2) * mc) eff = zeros(d); btw = zeros(d); win = zeros(d); rab = zeros(d) for j in 1:d x1 = vec(inst[i1, j, :]); x2 = vec(inst[i2, j, :]) @@ -128,9 +180,10 @@ end aldex2(counts, features, groups; mc_samples = 128, seed = 1) -> DAResult Two-group ALDEx2 on raw counts (samples × features). `groups` gives each -sample's condition and must have exactly two levels; the second level in sorted -order is compared against the first. The result has the columns `feature`, -`effect`, `pvalue`/`qvalue` (expected Welch p and expected BH), +sample's condition and must have exactly two levels; the effect compares the +second level in sorted order against the first. The tests compare the first +sample's condition against the other. The result has the columns `feature`, +`effect`, `pvalue`/`qvalue` (consistent-sign expected Welch p and expected BH), `wi_pvalue`/`wi_qvalue` (Wilcoxon), `diff_btw`, `diff_win` and `rab_all`. Deterministic for a fixed `seed` (StableRNG). Calibration is tested against the @@ -147,10 +200,11 @@ function aldex2(counts::AbstractMatrix{<:Integer}, features::AbstractVector, i1 = findall(==(levels[1]), groups) i2 = findall(==(levels[2]), groups) (length(i1) >= 2 && length(i2) >= 2) || throw(CompositionError("each group needs at least 2 samples")) + first_is_i1 = groups[1] == levels[1] rng = StableRNG(seed) inst = dirichlet_clr_instances(rng, counts; mc_samples) - table = aldex2_from_instances(inst, i1, i2; rng) + table = aldex2_from_instances(inst, i1, i2; rng, first_is_i1) insertcols!(table, 1, :feature => collect(features)) prov = Provenance(:aldex2, :native; seed, mc_samples, test = "welch+wilcoxon", contrast = "$(levels[2]) vs $(levels[1])", prior = 0.5) diff --git a/test/mutants.jl b/test/mutants.jl index f07d9ad..f2e558d 100644 --- a/test/mutants.jl +++ b/test/mutants.jl @@ -33,7 +33,7 @@ function mutant_aldex2_per_feature_pairs(inst, i1, i2; rng) t = CompositionalDA.aldex2_from_instances(inst, i1, i2; rng) n1 = length(i1) * size(inst, 3); n2 = length(i2) * size(inst, 3) for j in 1:size(inst, 2) - p = CompositionalDA.effect_pairs(rng, n1, n2, max(n1, n2)) + p = CompositionalDA.effect_pairs(rng, n1, n2) t.effect[j] = CompositionalDA.aldex2_effect(p, vec(inst[i1, j, :]), vec(inst[i2, j, :]))[1] end t From c806b540ddad6f2f9a163f9a42ab7fec510b1262 Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Fri, 2 Oct 2026 16:25:07 +0100 Subject: [PATCH 7/7] CI oracle: load the RCall extension directly so a load failure prints its error Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_019Y6e175rh1LbrsEhQvCrJ1 --- .github/workflows/ci.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7698340..2e94918 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -80,5 +80,8 @@ jobs: - name: Native vs reference agreement run: | export R_HOME="$(R RHOME)" - julia --project=test/oracle -e 'using Pkg; Pkg.develop(path="."); Pkg.instantiate()' + # Skip Pkg's bulk precompile: it reports a failed extension without its error. + # Loading directly below surfaces the real error if there is one. + JULIA_PKG_PRECOMPILE_AUTO=0 julia --project=test/oracle -e 'using Pkg; Pkg.develop(path="."); Pkg.instantiate()' + julia --project=test/oracle -e 'using CompositionalDA, RCall; @assert Base.get_extension(CompositionalDA, :CompositionalDARCallExt) !== nothing' julia --project=test/oracle test/oracle/runoracle.jl